我最近一直在使用 GitHub 上的 C # 驱动程序来玩 MongoDB (它的速度令人惊讶地快)。在我正在测试的单线程控制台应用程序中,一切都运行良好。我可以在8秒内运行单线程添加1,000,000个文档(是的,100万)。只有在使用 for 循环范围之外的连接时,才能获得这种性能。换句话说,我为每个插入保持连接打开,而不是为每个插入进行连接。显然这是人为的。
我想我应该把它提高一个档次,看看它是如何与多个线程一起工作的。我这样做是因为我需要模拟一个具有多个并发请求的网站。我将旋转15到50个线程,仍然在所有情况下总共插入150,000个文档。如果我只是让线程运行,每个线程为每个插入操作创建一个新的连接,那么性能就会陷入停顿。
显然,我需要找到一种方法来共享、锁定或池连接。这就是问题所在。连接 MongoDB 的最佳实践是什么?连接是否应该在应用程序的生命周期内保持打开状态(每次操作都有大量的开启和关闭 TCP 连接的延迟) ?
是否有人具有任何使用 MongoDB 的真实世界或生产经验,特别是底层连接?
下面是使用静态连接的线程示例,该连接为插入操作锁定。请提供建议,将最大限度地提高性能和可靠性在网络上下文!
private static Mongo _mongo;
private static void RunMongoThreaded()
{
_mongo = new Mongo();
_mongo.Connect();
var threadFinishEvents = new List<EventWaitHandle>();
for(var i = 0; i < 50; i++)
{
var threadFinish = new EventWaitHandle(false, EventResetMode.ManualReset);
threadFinishEvents.Add(threadFinish);
var thread = new Thread(delegate()
{
RunMongoThread();
threadFinish.Set();
});
thread.Start();
}
WaitHandle.WaitAll(threadFinishEvents.ToArray());
_mongo.Disconnect();
}
private static void RunMongoThread()
{
for (var i = 0; i < 3000; i++)
{
var db = _mongo.getDB("Sample");
var collection = db.GetCollection("Users");
var user = GetUser(i);
var document = new Document();
document["FirstName"] = user.FirstName;
document["LastName"] = user.LastName;
lock (_mongo) // Lock the connection - not ideal for threading, but safe and seemingly fast
{
collection.Insert(document);
}
}
}