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

时间:2015-09-21 19:25:21

标签: c# mongodb

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

3 个答案:

答案 0 :(得分:13)

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

来自the docs

  

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

有一个部分/旧的线程安全MongoDB类列表in this SO answer

答案 1 :(得分:1)

这个问题似乎已经在When should i be opening and closing MongoDB connections?

处提出 kinda

如果接受了答案,

  

我会在重新创建连接时保持连接打开   昂贵。 Mongo很好,有很多连接,打开很长时间。   理想情况下,您应该与所有部件共享连接   您的应用程序作为持久连接。 C#驱动程序应该   要聪明到能够做到这一点,所以它也不会创造出来   许多连接,因为它在内部使用“连接池”   甚至可以重复使用连接。文档说:“与...的联系   服务器在后台自动处理(连接   池用于提高效率。“

对你来说很好,然后一切顺利。甚至是MongoDB C#驱动程序的quick tour page lends the same advice -

  

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

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

答案 2 :(得分:0)

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

我通过添加:

解决了这个问题
MongoClientSettings settings = MongoClientSettings.FromUrl(new MongoUrl(connectionString));
            settings.SslSettings = new SslSettings() { EnabledSslProtocols = SslProtocols.Tls12 };
            settings.MaxConnectionIdleTime = TimeSpan.FromSeconds(30);