MongoDB+;C#
在实际使用MongoDB之前,我正在测试它的性能。我正在尝试查看每秒可以更新多少文档。我正在使用C#(Mono+Ubuntu)MongoDB驱动程序v1.9和MongoDB v2.4.6 我相信MongoDB中最有效的写性能参数之一是MongoDB+;C#,mongodb,mongodb-.net-driver,Mongodb,Mongodb .net Driver,在实际使用MongoDB之前,我正在测试它的性能。我正在尝试查看每秒可以更新多少文档。我正在使用C#(Mono+Ubuntu)MongoDB驱动程序v1.9和MongoDB v2.4.6 我相信MongoDB中最有效的写性能参数之一是写关注点。如中所述,写入关注点的最宽松值将是-1,然后是0,最后是1 搜索后,我发现我可以在连接字符串中嵌入C#中设置写关注点,如下所示: var client = new MongoClient("mongodb://localhost/?w=-1"); Fin
写关注点
。如中所述,写入关注点的最宽松值将是-1
,然后是0
,最后是1
搜索后,我发现我可以在连接字符串中嵌入C#中设置写关注点,如下所示:
var client = new MongoClient("mongodb://localhost/?w=-1");
FindAndModifyArgs args = new FindAndModifyArgs();
args.SortBy = SortBy.Ascending("last_update");
args.Update = Update<Entity>.Set(e => e.last_update, DateTime.Now);
args.Fields = Fields.Include(new string[] { "counter", "_id" });
var m = collection.FindAndModify(args);
Entity ent = m.GetModifiedDocumentAs<Entity>();
var query = Query<Entity>.EQ(e => e.Id, ent.Id);
var update = Update<Entity>.Set(e => e.counter, ent.counter+1);
collection.Update(query, update);
using (server.RequestStart(database)) {
FindAndModifyArgs args = new FindAndModifyArgs();
args.SortBy = SortBy.Ascending("last_update");
args.Update = Update<Entity>.Set(e => e.last_update, DateTime.Now);
args.Fields = Fields.Include(new string[] { "counter", "_id" });
var m = collection.FindAndModify(args);
Entity ent = m.GetModifiedDocumentAs<Entity>();
var query = Query<Entity>.EQ(e => e.Id, ent.Id);
var update = Update<Entity>.Set(e => e.counter, ent.counter+1);
collection.Update(query, update);
}
以下是我在w
中使用不同值的结果:
w
设置为1
时,可以获得最快的结果李>
w=0
比w=1
慢28倍李>
w=-1
将导致引发异常,并显示错误消息w值必须大于或等于零
李>
有人对这些结果有什么解释吗?我做错什么了吗
[更新]
我认为有必要设定测试程序,也许其中隐藏着什么。下面是:
我有一个数据库,在一个集合中有1亿个文档。每个文档都是使用mongo shell创建的:
{ "counter" : 0, "last_update" : new Date() }
下面是db.collection.stats()的输出代码>:
使用Ubuntu 12.04中的Mono 3.2.1,我编写了一个C#项目,该项目连接到MongoDB,并尝试更新如下文档:
var client = new MongoClient("mongodb://localhost/?w=-1");
FindAndModifyArgs args = new FindAndModifyArgs();
args.SortBy = SortBy.Ascending("last_update");
args.Update = Update<Entity>.Set(e => e.last_update, DateTime.Now);
args.Fields = Fields.Include(new string[] { "counter", "_id" });
var m = collection.FindAndModify(args);
Entity ent = m.GetModifiedDocumentAs<Entity>();
var query = Query<Entity>.EQ(e => e.Id, ent.Id);
var update = Update<Entity>.Set(e => e.counter, ent.counter+1);
collection.Update(query, update);
using (server.RequestStart(database)) {
FindAndModifyArgs args = new FindAndModifyArgs();
args.SortBy = SortBy.Ascending("last_update");
args.Update = Update<Entity>.Set(e => e.last_update, DateTime.Now);
args.Fields = Fields.Include(new string[] { "counter", "_id" });
var m = collection.FindAndModify(args);
Entity ent = m.GetModifiedDocumentAs<Entity>();
var query = Query<Entity>.EQ(e => e.Id, ent.Id);
var update = Update<Entity>.Set(e => e.counter, ent.counter+1);
collection.Update(query, update);
}
问题是:有人能解释为什么w=0
比w=1
慢得多,为什么w=-1
不受支持吗
[更新]
我也在我的代码中进行了如下测试:
var client = new MongoClient("mongodb://localhost/?w=-1");
FindAndModifyArgs args = new FindAndModifyArgs();
args.SortBy = SortBy.Ascending("last_update");
args.Update = Update<Entity>.Set(e => e.last_update, DateTime.Now);
args.Fields = Fields.Include(new string[] { "counter", "_id" });
var m = collection.FindAndModify(args);
Entity ent = m.GetModifiedDocumentAs<Entity>();
var query = Query<Entity>.EQ(e => e.Id, ent.Id);
var update = Update<Entity>.Set(e => e.counter, ent.counter+1);
collection.Update(query, update);
using (server.RequestStart(database)) {
FindAndModifyArgs args = new FindAndModifyArgs();
args.SortBy = SortBy.Ascending("last_update");
args.Update = Update<Entity>.Set(e => e.last_update, DateTime.Now);
args.Fields = Fields.Include(new string[] { "counter", "_id" });
var m = collection.FindAndModify(args);
Entity ent = m.GetModifiedDocumentAs<Entity>();
var query = Query<Entity>.EQ(e => e.Id, ent.Id);
var update = Update<Entity>.Set(e => e.counter, ent.counter+1);
collection.Update(query, update);
}
使用(server.RequestStart(数据库)){
FindAndModifyArgs args=新的FindAndModifyArgs();
args.SortBy=SortBy.Ascending(“上次更新”);
args.Update=Update.Set(e=>e.last\u Update,DateTime.Now);
args.Fields=Fields.Include(新字符串[]{“counter”,“_id”});
var m=collection.FindAndModify(args);
实体ent=m.GetModifiedDocuments();
var query=query.EQ(e=>e.Id,ent.Id);
var update=update.Set(e=>e.counter,ent.counter+1);
收集、更新(查询、更新);
}
它对任何结果都没有显著影响。要解决w=-1
错误,您可能需要直接使用
您的测试代码可能遇到一致性问题。查看以将查询放在同一个连接上。根据文件:
例如,当WriteConcern为w=0时,快速连续调用一系列插入,并且您希望在此后立即以一致的方式查询数据(WriteConcern为w=0时,写入可以在服务器上排队,其他连接可能无法立即看到)
Aphyr介绍了MongoDB写关注点的各种设置对其一致性的影响。它可能会帮助您解决此问题
最后,您可以在中找到您的驱动程序版本最新版本是1.8.2,您应该验证您真正拥有的版本。我不知道是否支持w=n
语法,但由于我发现连接字符串是一种奇怪的反模式,我建议您使用类似var collection=db.GetCollection(“Foo”)的东西,WriteConcern.已确认)
例如,WriteConcern
类允许非常细粒度的控制。最后,对于任何性能度量,请确保连接池是热的,操作数是重要的,并且您使用的是Stopwatch
或QueryPerformanceCounter
,而不是DateTime
classW我可以在这里找到我的MongoDB C#驱动程序的版本吗?我不到一个月前从github下载了源代码,所以我确信它没有那么旧,但如果我能找到确切的版本号就太好了。谢谢你的帖子,但是WriteConcern。未确认的不等于w=-1
。未确认的等于w=0
w=-1
被称为错误忽略
模式,我在WriteConcern
类中找不到该模式。我将研究您的其余建议,并让您知道它们的进展情况。