从c# 2.1驱动程序正确关闭MongoDB数据库连接

本文关键字:MongoDB 数据库连接 驱动程序 | 更新日期: 2023-09-27 18:13:44

我刚刚开始将MongoDB集成到我的应用程序中,我遇到了几个问题。在我的应用程序中,我使用最新的2.1版本的MongoDB c#驱动程序,只使用MongoDB进行应用程序日志记录。

目前在显示我的主应用程序Form之前,我首先检查mongod.exe是否正在运行,如果没有,我启动它。然后,当我的主Form显示时,它打开一个连接到数据库,用于如下所示。

public void Open()
{
    Client = new MongoClient("mongodb://localhost:27017");
    Database = Client.GetDatabase(DBName);
    Collection = Database.GetCollection<BsonDocument>(ColName);
}

我的问题是,当我的应用程序关闭时,我应该如何正确地关闭此连接?

每次应用程序关闭时,我是否应该考虑让mongod.exe运行而不是退出它?

我已经搜索了几次,试图找出是否有一个适当的方法来关闭连接,但没有发现任何非常具体的。有一个旧的SO帖子(我现在似乎找不到)提到.Dispose方法,尽管我似乎无法在最新的驱动程序中找到它,也无法从我的IDE的自动完成。

从c# 2.1驱动程序正确关闭MongoDB数据库连接

作为今天的MongoDB版本(v2.0.1.27 for MongoDB.Driver),没有必要关闭或处置连接。客户端自动处理。

From the docs:

一个MongoClient对象将是根对象。它是线程安全的,是处理连接到服务器、监视服务器和对这些服务器执行操作所需要的一切。[…]建议将MongoClient实例存储在全局位置,可以作为静态变量或具有单例生存期的IoC容器中。但是,使用相同设置创建的多个MongoClient实例将利用下面相同的连接池。

有一个线程安全的MongoDB类的部分/旧列表在这个SO回答。

这个问题似乎已经有点在这里问我什么时候应该打开和关闭MongoDB连接?

如果是可接受的答案,

我会在重新创建连接时保持连接打开昂贵的。Mongo很好,有很多关系,开放了很长时间。理想情况下,你应该做的是与所有部分共享连接将应用程序作为持久连接。c#驱动程序应该这样做要足够聪明,自己做这件事,这样它就不会再创造了许多连接,因为它内部使用"连接池",即使它甚至可以重用连接。医生说:"与服务器在后台自动处理(连接)池用于提高效率)。"

对你来说很好,那么一切都很好。甚至MongoDB c#驱动程序的快速浏览页面也提供了相同的建议-

通常只为给定的集群创建一个MongoClient实例并在整个应用程序中使用它。创建多个mongoclient然而,当且仅当,它们还会共享相同的连接池吗连接字符串相同


否则,我认为您可以简单地将调用放在using(){}代码块中创建连接。它会自动为您调用dispose方法(因为它实现了IDisposable模式)。

根据我的经验,正确的方法是回答,但即使遵循这些建议,我仍然有随机的EndOfStreamException。有些问题似乎是由于网络提供商在一段时间后关闭连接引起的。

我解决了这个问题:

MongoClientSettings settings = MongoClientSettings.FromUrl(new MongoUrl(connectionString));
            settings.SslSettings = new SslSettings() { EnabledSslProtocols = SslProtocols.Tls12 };
            settings.MaxConnectionIdleTime = TimeSpan.FromSeconds(30);