何时应该打开和关闭MongoDB连接?

12

我对MongoDB和NoSQL技术非常陌生,刚开始使用MongoDB / Norm / ASP.NET MVC 3构建网站。

我想知道如何限定连接到Mongo数据库的范围。

现在我有一个Basecontroller,它实例化了MongoSession,并在OnActionExecuted()中将其Dispose掉,使得所有派生的Controller都能访问到我的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连接是否是“昂贵”的操作?

规范几乎不再被维护,如果您想要LINQ支持,请选择官方的mongo驱动程序,并在其上使用FluentMongo。 - Zaid Masud
除了代码中打开和关闭连接的问题之外,我还遇到了互联网服务提供商关闭连接,然后我的代码出现了EndOfStreamException的问题。我通过使用settings.MaxConnectionIdleTime = TimeSpan.FromSeconds(30);解决了这个问题。https://dev59.com/dVwY5IYBdhLWcg3wWmxn#44606284 - Tony
2个回答

11
我会将连接保持开放,因为重新创建连接的成本很高。Mongo 可以处理大量长时间开放的连接。理想情况下,您应该将连接作为持久连接与应用程序的所有部分共享。C# 驱动程序应该足够聪明,自己完成这个过程,以便它不会创建太多连接,因为它在内部使用“连接池”来复用连接。文档中说:“服务器的连接在幕后自动处理(使用连接池以提高效率)。” 祝好, Derick

2
同意。实际上,你甚至不需要编写一个MongoSession类——在应用程序范围内存储一个MongoServer实例是合适的。当MVC应用程序关闭时,你几乎肯定只需要调用此实例的Disconnect()方法一次。 - Sean Reilly
@Sean 感谢你提供的关闭连接的提示。 - Akshat Jiwan Sharma

2

1
链接(现在)没有提到任何内容,它只是几个其他页面的父页面。 - danio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接