c# - .NET MongoDB 连接的最佳实践?

我最近一直在使用 GitHub 上的 C# 驱动程序玩 MongoDB(速度非常快)。在我正在测试的小型单线程控制台应用程序中,一切正常。我能够在运行单线程的 8 秒内添加 1,000,000 个文档(是的,百万个)。如果我在 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);
        }
    }
}

最佳答案

这里的大多数答案都已过时并且不再适用,因为 .net 驱动程序已经成熟并添加了无数功能。

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

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

It is recommended to store a MongoClient instance in a global place, either as a static variable or in an IoC container with a singleton lifetime.

https://stackoverflow.com/questions/2194047/

相关文章:

MongoDB 通过 Mongoose JS - findByID 是什么?

mongodb - 在 Mongo 中,分片和复制有什么区别?

sql - MongoDB如何避免SQL注入(inject)困惑?

mongodb - MongoDB stats() 函数是否返回位或字节?

mongodb - mongoDB中的字符串字段值长度

mongodb - 如何在 Mongoose 中进行原始 mongodb 操作?

mongodb - 检查 MongoDB upsert 是否进行了插入或更新

mongodb - 在 MongoDB 中传递给 $in 查询的最大参数数是多少?

python - 如何从 pymongo 发出 "show dbs"

mongodb - 如何按插入时间对 Meteor 集合进行排序?