Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 理解MongoDB C中的WriteConcern#_C#_.net_Mongodb_Mongodb .net Driver - Fatal编程技术网

C# 理解MongoDB C中的WriteConcern#

C# 理解MongoDB C中的WriteConcern#,c#,.net,mongodb,mongodb-.net-driver,C#,.net,Mongodb,Mongodb .net Driver,我一直在读MongoDB的文章。我知道有几个级别决定了写入操作成功的保证级别,您设置的这个级别越高,性能就越好。然而,我在一个C#环境中工作,我试图找出如何在那里使用写关注点,以及在某些情况下什么级别最适合。我已经了解了如何使用WriteConcernResult对象收集检查结果,我主要对级别本身感兴趣 以下是我的问题: 如何为特定写入设置C#中的写入关注级别? 建议使用连接字符串,但这看起来像是一个全局设置,我不希望这样,因为我将使用的一些写操作比其他操作更“重要”,我不想破坏性能。我注意到有

我一直在读MongoDB的文章。我知道有几个级别决定了写入操作成功的保证级别,您设置的这个级别越高,性能就越好。然而,我在一个C#环境中工作,我试图找出如何在那里使用写关注点,以及在某些情况下什么级别最适合。我已经了解了如何使用WriteConcernResult对象收集检查结果,我主要对级别本身感兴趣

以下是我的问题:

如何为特定写入设置C#中的写入关注级别?

建议使用连接字符串,但这看起来像是一个全局设置,我不希望这样,因为我将使用的一些写操作比其他操作更“重要”,我不想破坏性能。我注意到有一个驱动程序名称空间,但文档中并没有详细说明它的使用(它位于文档中的MongoDB.Driver名称空间下)

特别是,如何将其设置为“Journaled”或“Replica Acknowledged”,因为默认情况下它是“Acknowledged”的

对于每个级别,哪些类型的问题可以通过写问题检查?


例如:系统崩溃、电源故障、网络连接问题等。我特别感兴趣的是一些不容易检测到的东西,由于电源故障等非常明显,我们可以估计操作失败的时间间隔,并做出相应的反应。

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毫秒。

对于2.x c#驱动程序,您可以通过以下方式使用写关注点:

var collection = db.GetCollection<Record>(collectionName)
    .WithWriteConcern(new WriteConcern(
        w: 1,
        wTimeout: default(TimeSpan?),
        fsync: true,
        journal: false));
有几个预定义的写关注点,例如

对于非常快速但不可靠的更新:

var collection = db.GetCollection<Record>(collectionName)
    .WithWriteConcern(WriteConcern.Unacknowledged);
var collection=db.GetCollection(collectionName)
.带有WriteConcern(WriteConcern.未确认);
或用于类似于默认值(w=1)的WriteConcern

var collection=db.GetCollection(collectionName)
.具有WriteConcern(WriteConcern.W1);
或用于确认副本集的多数成员

var collection = db.GetCollection<Record>(collectionName)
    .WithWriteConcern(WriteConcern.WMajority);
var collection=db.GetCollection(collectionName)
.具有WriteConcern(WriteConcern.WMajority);
有关详细信息和更多选项,请参见此处的文档:

Insert/Update/Remove方法具有接受WRITECOCERN的重载。好的,谢谢您提供的信息!您是否还知道,对于每个级别(在我上面的第二个问题中指定),哪些类型的问题可能潜行而未被发现。我想知道为不同的操作设置什么级别,以平衡性能和数据完整性。编辑:另外,WriteConcern.W4是否有效地将写关注级别设置为最高级别“副本已确认”?如果是这样的话,是否需要日志标志?数据不是在副本确认阶段之前记录下来的吗?我真的不明白你所说的偷偷摸摸的问题是什么意思。如果使用Unacknowledged,那么您将不会意识到错误,如果您复制到副本集中10个实例中的2个,并且这两个实例失败,那么您的数据将丢失。@AugPopa replica Acknowledged实际上不是一个级别。任何高于1的w级别都需要副本确认,wmajority也需要。它设置所需的实例数(包括主实例)。日志标志添加了一个仅与主实例相关的无关需求。在本文中,我尝试使用writeConcern.Journal=true,但结果证明它是只读的。我猜W[number]write concern level设置了它应该设置的方式。@user1635881这个答案与1.x驱动程序相关。您使用的是2.xOne吗?C#驱动程序的默认写入关注点是什么?我原以为它会像MongoDB一样是w=1,但我从来没有设置写关注点,它似乎默认为“多数”。。。这是一个bug还是C#driver的“多数”?..@AsheqReza:C#driver只是mongodb服务器的一个API,因此您在C#代码中设置的wc-只是在命令中发送到mongodb服务器。与将{writeConcern:{w:“多数”}添加到insert/update命令时产生的影响类似。看看这是否增加了很多速度提升,我有一个mongo实例,过去的250mil记录像狗一样运行。这解决了我的问题。我不知道为什么我必须显式地添加
。with WriteConcern(WriteConcern.WMajority)
,因为它在迁移到fluent配置以代替注释之前工作,但我做到了。而且它已经是我连接字符串的一部分了。很奇怪。
var collection = db.GetCollection<Record>(collectionName)
    .WithWriteConcern(WriteConcern.W1);
var collection = db.GetCollection<Record>(collectionName)
    .WithWriteConcern(WriteConcern.WMajority);