.NET的MongoDB连接最佳实践是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (27)

我一直在使用GitHub上的C#驱动程序来玩MongoDB(它的速度惊人)。在我测试的小型单线程控制台应用程序中,一切正常。我可以在8秒内添加1,000,000个文件(是,百万),并运行单线程。如果我使用for循环的范围之外的连接,我只会获得此性能。换句话说,我保持每个插入的连接打开,而不是连接每个插入。显然这是人为的。

我认为我会把它提升一个档次,看看它是如何与多个线程一起工作的。我这样做是因为我需要模拟具有多个并发请求的网站。我在15到50个线程之间旋转,在所有情况下仍然插入总共150,000个文件。如果我只是让线程运行,每个线程为每个插入操作创建一个新的连接,则性能会停下来。

显然,我需要找到一种方法来共享,锁定或合并连接。这就是问题所在。连接到MongoDB的最佳做法是什么?连接应该在应用程序的整个生命周期内保持打开状态(每个操作都有大量的延迟打开和关闭TCP连接)?

有没有人有MongoDB的真实世界或生产经验,特别是底层连接?

这里是我使用静态连接的线程示例,该连接被锁定用于插入操作。请提供建议,以最大限度地提高Web环境中的性能和可靠性!

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);
        }
    }
}
提问于
用户回答回答于

关于静态连接要记住的是它在所有线程中共享。你想要的是每个线程一个连接。

用户回答回答于

查看这里找到的新的2.0驱动程序的文档:http : //mongodb.github.io/mongo-csharp-driver/2.0/reference/driver/connecting/

.net驱动程序现在是线程安全的并处理连接池。根据文件

建议将MongoClient实例存储在全局位置,可以作为静态变量存储,也可以存储在具有单例生命周期的IoC容器中。

扫码关注云+社区