對於某些應用程序來講,寫關注是重要的。它能判斷哪些寫操做成功寫入了,哪些失敗了,對於失敗的操做,驅動程序能返回錯誤,由應用程序決定怎麼處理。若是沒有寫關注,應用程序發送一個寫操做到socket後,就不會管後面發送了什麼狀況,不知道是否成功寫入數據庫,這種情形對於日誌類型的應用程序仍是能夠接受的,由於偶爾的寫失敗不會影響整個日誌的監控狀況;帶有寫關注的操做會等到數據庫確認成功寫入後才能返回,所以寫關注會帶來一點性能的損失。下面先分析複製集上寫關注配置。數據庫
默認狀況下複製集的寫關注只針對primary節點,當應用程序發送一個寫操做請求時,驅動程序會調用getLastError命令返回寫操做的執行狀況(這一動做對應用程序來講是透明的),getLastError命令會根據你配置的寫關注選項來執行。寫關注選項的配置是針對當前客戶端與數據庫的socket鏈接來講的,所以配置項須要經過應用程序傳遞給驅動程序。固然若是你沒有傳遞任何選項參數給驅動程序,getLastError命令會根據你配置在複製集中默認配置local.system.replset.settings.getLastErrorDefaults來執行。getLastError命令的經常使用選項以下:網絡
(1) 選項wsocket
當取值爲-1時,驅動程序不會使用寫關注,忽略掉全部的網絡或socket錯誤。性能
當取值爲0時,驅動程序不會使用寫關注,只返回網絡和socket的錯誤。ui
當取值爲1時,驅動程序使用寫關注,可是隻針對primary節點,這個配置項是複製集或單mongod實例的默認寫關注配置。日誌
當取值爲整數且大於1時,寫關注將針對複製集中n個節點,當客戶端收到這些節點的反饋信息後,命令才返回給客戶端繼續執行。server
(2)選項wtimeout對象
指定寫關注應在多長時間內返回,若是你沒有指定這個值,複製集可能由於不肯定因素致使應用程序的寫操做一直阻塞。文檔
下面經過一段代碼對上面的描述作個回顧,在C#驅動程序下鏈接複製集並插入一條記錄。get
//實例化一個客戶端的鏈接屬性實例
MongoClientSettings clientSetting = new MongoClientSettings();
//設置屬性準備Servers爲要鏈接的複製集中的全部成員實例
List<MongoServerAddress> Servers = new List<MongoServerAddress>();
Servers.Add(new MongoServerAddress("Guo",40000));
Servers.Add(new MongoServerAddress("Guo",40001));
Servers.Add(new MongoServerAddress("Guo",40002));
clientSetting.Servers = Servers;
clientSetting.ReplicaSetName = "rs0"; //設置屬性複製集的名稱
MongoClient client = new MongoClient(clientSetting);//根據設置的屬性,實例化客戶端
//獲得一個與複製集鏈接的實例
MongoServer server = client.GetServer();
//得到一個與具體數據庫鏈接對象,數據庫名爲students
MongoDatabase mydb = server.GetDatabase("students");
//得到數據庫中的表對象,即scores表
MongoCollection mydbTable = mydb.GetCollection("scores");
//準備一條數據,即聲明一個文檔對象
BsonDocument doc = new BsonDocument
{
{"stuid",5},
{"subject","sports"},
{"score",99}
};
//將文檔插入到數據庫中
mydbTable.Insert(doc);
上面代碼向複製集中插入一條數據,可是客戶端的配置屬性都是默認的,寫關注w選項值爲1,能夠在C#的驅動程序中經過MongoClientSettings這個類來設置客戶端的鏈接屬性,包括寫關注等;上面的代碼也沒有具體指定鏈接到哪一個節點,但驅動程序會默認的選擇primary節點;當primary節點宕機時,複製集從新選擇出新的primary節點,驅動程序嘗試從新鏈接新的primary節點並完成插入,這個動做對應用程序透明的。