【问题标题】:When should i be opening and closing MongoDB connections?我应该什么时候打开和关闭 MongoDB 连接?
【发布时间】:2012-02-28 15:37:24
【问题描述】:

总的来说,我对 MongoDB 和 NoSQL 非常陌生,我刚刚开始使用 MongoDB / Norm / ASP.NET MVC 3 构建一个站点。

我想知道我应该如何确定与 Mongo 数据库的连接范围。

现在我有一个实例化 MongoSession 和 onActionExecuted 的 Basecontroller,我将其处理掉,因此我所有的派生控制器都可以访问我的 MongoSession。 MongoSession 类在其构造函数中打开一个连接并将其释放到 Dispose() 上,这就是它目前的工作方式。

private IMongo _mongo;

public MongoSession()
{         
    _mongo = Mongo.Create("connString");      
} 

public void Dispose()
{
    _mongo.Dispose();
}

我有点担心如果我还在控制器中做其他事情,它可能会保持连接打开太久。

这种方法是否足以避免打开太多连接的风险,还是我应该做一些更像下面的示例方法的事情?

   public void Add<T>(T item) where T : class, new()
   {
       using (var mongo = Mongo.Create("connString"))
       {
         mongo.GetCollection<T>().Insert(item); 
       }
   }

另一个后续问题是:

是否通过 Norm “昂贵”的操作打开和关闭 MongoDB 连接?

【问题讨论】:

  • Norm 几乎不再被维护,如果你想要 LINQ 支持,请使用官方的 mongo 驱动程序和 FluentMongo。
  • 除了在代码上打开和关闭连接的问题之外,我遇到了互联网提供商关闭连接的问题,然后我的代码出现了 EndOfStreamException。我通过使用 settings.MaxConnectionIdleTime = TimeSpan.FromSeconds(30); 解决了它stackoverflow.com/a/44606284/194717

标签: mongodb database-connection mongodb-.net-driver scoping norm


【解决方案1】:

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

干杯, 德里克

【讨论】:

  • 同意。事实上,你甚至不需要编写一个 MongoSession 类——在应用程序范围内存储一个 MongoServer 实例是合适的。当 MVC 应用程序关闭时,您几乎可以肯定只在此实例上调用一次 Disconnect()。
  • @Sean 感谢关于何时关闭连接的提示。
【解决方案2】:

您不需要调用 Connect 或 Disconnect

C# 驱动程序有一个连接池,可以有效地使用与服务器的连接。无需调用 Connect 或 Disconnect;只需让驱动处理连接(调用 Connect 是无害的,但调用 Disconnect 是不好的,因为它会关闭连接池中的所有连接)。

http://docs.mongodb.org/ecosystem/tutorial/getting-started-with-csharp-driver/

【讨论】:

  • 链接(现在)没有提及任何内容,它只是其他几个的父页面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 2014-06-27
  • 2011-03-21
相关资源
最近更新 更多