2014-10-30 33 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