释放返回MongoDB连接池的连接

本文关键字:连接 MongoDB 返回 释放 | 更新日期: 2023-09-27 18:26:40

我有一个C#应用程序,它通过C#线程池执行多线程插入MongoDB。然而,我得到了TimeoutException: Timeout waiting for a MongoConnection。我使用的是MongoServer.RequestStart方法,它应该将连接释放回MongoClient连接池。

此外,线程池至少有4个线程,最多有8个,而Mongo连接池默认有100个连接,所以我不应该用完连接。

那么为什么我会出现这个错误呢?

下面是传递到线程池中的方法。_client是MongoClient实例变量。

public void BatchInsert(string collectionName, BinaryPacketDocument[] documents, int batchSize) {
        MongoServer server = _client.GetServer();
        MongoDatabase database = server.GetDatabase(_databaseName);
        using (server.RequestStart(database)) {
            MongoCollection collection = database.GetCollection(collectionName);
            collection.InsertBatch(documents);
            StatisticsManager.GetCounter("logs").Add(batchSize);    
        }
    }

下面是我将其传递到线程池的方法。

private void SendWorkToThreadPool(string collectionName, BinaryPacketDocument[] documents, int batchSize) {
        if (documents.Length != 0) {
            ThreadPool.QueueUserWorkItem(state => _inserter.BatchInsert(collectionName, documents, batchSize)); 
        }
    }

释放返回MongoDB连接池的连接

我意识到我的线程池实际上并没有被限制为8个线程。如果将0作为参数之一传递给ThreadPool.SetMax/Min线程,它将无法设置最大值(但不是显式设置)。