Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C#2.1驱动程序正确关闭MongoDB数据库连接?_C#_Mongodb - Fatal编程技术网

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

从C#2.1驱动程序正确关闭MongoDB数据库连接?,c#,mongodb,C#,Mongodb,我刚刚开始将MongoDB集成到我的应用程序中,我遇到了一些问题。在我的应用程序中,我使用最新的2.1版本的MongoDB C#驱动程序,并且只使用MongoDB进行应用程序日志记录 当前,在显示我的主应用程序窗体之前,我首先检查mongod.exe是否正在运行,如果没有,我将启动它。然后,当显示我的主表单时,它会打开一个到数据库的连接以供使用,如下所示 public void Open() { Client = new MongoClient("mongodb://localhost:

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

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

public void Open()
{
    Client = new MongoClient("mongodb://localhost:27017");
    Database = Client.GetDatabase(DBName);
    Collection = Database.GetCollection<BsonDocument>(ColName);
}
public void Open()
{
客户端=新的MongoClient(“mongodb://localhost:27017");
Database=Client.GetDatabase(DBName);
Collection=Database.GetCollection(ColName);
}
我的问题是,当我的应用程序关闭时,我应该如何正确地关闭此连接

在让
mongod.exe运行与每次关闭应用程序时退出时,我还应该考虑哪些因素


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

这个问题似乎已经在这里被问过了

如果这是公认的答案

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

对你很好,那么一切都很好。即使是MongoDB C#driver's——

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



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

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

发件人:

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


有一个部分/旧的线程安全MongoDB类列表。

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

我补充道:

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

我看到了这个答案,但它更倾向于拥有多个
IMongoClient
s,而不是如何正确关闭它们。我想ashes999的答案主要在下面虽然我仍然部分不确定是否应该在应用程序关闭后继续运行Mongo守护进程。@KDecker:我看不出其他答案和我的答案有什么区别。无论如何,即使关闭连接,MongoDB的观点也不会对连接池产生任何影响。您可以关闭它,让您安心。这就是我如何处理我的
IMongoClient
,它位于我的所有应用程序都可以访问的单例日志类中。我猜这个答案也基本上让我相信,它不需要什么特别的东西来关闭它虽然我仍然部分不确定是否应该在应用程序关闭后继续运行Mongo守护程序。当前版本的驱动程序(2.11)中似乎存在错误,但一旦我在一个简单的控制台应用程序中创建了一个新的MongoClient,控制台程序将无法自行关闭。