2014-10-30 83 views
6

我一直在閱讀MongoDB中的Write Concern。我知道有幾個級別決定了寫入操作成功的保證級別,對於設置這個級別的較高級別,性能權衡會有所影響。然而,我正在C#環境中工作,我正在嘗試弄清楚如何使用Write Concern以及哪些級別在某些情況下最適合。我已經想出瞭如何使用WriteConcernResult對象收集檢查結果,我主要關注層次本身。瞭解MongoDB中的WriteConcern C#

這是我的問題:

如何設置在C#中特定的寫入的寫入關注程度?

This answer建議使用連接字符串,但是這看起來像一個全局設置,這是我不希望的,因爲一些我將使用的寫操作都是比別人更「重要」,我不希望殺死表現。我注意到有一個WriteConcern class,但文檔沒有詳細說明它的用法(它在文檔中的MongoDB.Driver命名空間下)。

特別是,如何將其設置爲「Journaled」或「Replica Acknowledged」,默認情況下爲「已確認」?

什麼類型的問題可以通過寫關注檢查每個級別?

例如:系統崩潰,電源故障,網絡連接問題,等我的東西通過偷渡特別感興趣的是不容易發現,如電源故障等是非常明顯的,我們可以估算時間間隔,其中操作可能失敗並作出相應反應。

+0

Insert/Update/Remove方法具有接受WriteConcern的重載。 – CodeCaster 2014-10-30 18:51:27

回答

1

在MongoDB的C#駕駛員的操作有重載接受WriteConcern,您可以通過使用類構造函數或使用預定義的靜態屬性得到:

var writeConcern = WriteConcern.W4; 
writeConcern.Journal = true; 
writeConcern.WTimeout = TimeSpan.FromMilliseconds(100); 
new MongoClient().GetServer().GetDatabase("").GetCollection("").Insert(null, null, writeConcern); 

例如,這需要在頂部3個副本主要,因此W4,日誌標誌打開,wtimeout設置爲100毫秒。

+0

好的謝謝你的信息!你是否也知道哪些類型的問題可以通過未檢測到的每個級別(在我上面的第二個問題中指定)潛入。我想了解爲不同操作設置什麼級別以平衡性能和數據完整性。 編輯:另外,WriteConcern.W4是否有效地將寫入關注級別設置爲最高級別的「Replica Acknowledged」?如果是這樣,那麼Journal標誌甚至是必要的嗎?數據是否在副本確認階段之前得到記錄? – CynicalProgrammer 2014-10-31 14:26:10

+0

我不太明白偷偷摸摸的問題是什麼意思。如果您使用Unacknowledged,那麼您將不會意識到錯誤,如果您複製到副本集中10箇中的2個實例,並且這兩個失敗,則您的數據將丟失。 – i3arnon 2014-10-31 21:45:54

+1

@AugPopa Replica已確認並不是真正的關卡。任何高於1的w水平都需要副本確認,wmajority也是如此。它設置所需實例的數量(包括主要實例)。日誌標誌添加了一個與主實例相關的不相關需求。更多在[文檔](http://docs.mongodb.org/manual/reference/write-concern/) – i3arnon 2014-10-31 21:55:13