繁体   English   中英

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

[英]Properly shutting down MongoDB database connection from C# 2.1 driver?

我刚刚开始将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自动完成。

截至今天的MongoDB版本( v2.0.1.27MongoDB.Driver ),无需关闭或处理连接。 客户端自动处理它。

来自文档

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

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

这个问题似乎已经被还挺这里问在什么时候应该可以打开和关闭的MongoDB连接?

如果它被接受了答案,

我会保持连接打开,因为重新创建连接是昂贵的。 Mongo很好,有很多连接,打开很长时间。 理想情况下,您应该与应用程序的所有部分共享连接作为持久连接。 C#驱动程序应该足够聪明,可以自行完成,因此它不会创建太多的连接,因为它内部使用“连接池”,甚至可以重用连接。 文档说:“服务器的连接是在幕后自动处理的(连接池用于提高效率)。”

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

通常,您只为给定群集创建一个MongoClient实例,并在整个应用程序中使用它。 但是,当且仅当连接字符串相同时,创建多个MongoClients仍将共享相同的连接池。


否则,我认为您可以简单地调用以在using(){}代码块中创建连接。 它会自动为您调用dispose方法(因为它实现了IDisposable模式)。 您应该将此块用于您想要处置的任何资源。

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

我通过添加以下解决方法:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM