Mongo C#驱动程序尝试重新连接连接失败

时间:2014-05-22 17:29:28

标签: c# mongodb mongodb-.net-driver

是否有一种通用的方法从C#驱动程序中恢复MongoDB中的连接错误? 目前,如果MongoDB关闭,我的Windows服务将关闭。我目前在我的Windows服务开始时将我的应用程序结构如下:

//Set up connections for Mongo
var con = new MongoConnectionStringBuilder(ConfigurationManager.ConnectionStrings["MongoDB"].ConnectionString);
var client = new MongoClient(con.ToString());
var server = client.GetServer();
var db = server.GetDatabase(con.DatabaseName);

然后我将db对象注入我的存储库。

我正在尝试找到类似事件处理程序或我可以在整个应用程序中监听的条件,以防止因为某些原因mongo崩溃而导致整个服务崩溃。

2 个答案:

答案 0 :(得分:2)

根据driver document的建议,添加了MongoClient来管理副本集内容,您需要更早或更晚的内容。为避免大规模代码重构,您需要现在更好地使用它。 MongoClient是线程安全的,已经在副本集节点之间实现了故障转移逻辑。它应该与您的应用程序域一起构成单例。因此,您可以注入MongoClient,而不是db(甚至不是线程安全的)。

因此总是从GetServer()重试GetDatabase()MongoClient,并尝试/捕获它们产生的异常,当MongoDB再次联机时,最终会为您提供可用的db对象。 /> 关键是,MongoDB不会通知客户其在线,因此也没有这样的事件通知您。您必须继续尝试在客户端,直到它没问题。为了避免降低服务的例外情况,您必须抓住它们。

编辑:根据document,我对线程安全性有误。但是,它并没有改变你不应该存储MongoDatabase以便将来迁移到副本集的事实。

答案 1 :(得分:0)

除了yaoxing的回答,还想展示代码片来解决这个问题。

var client = new MongoClient(connString);
var server = client.GetServer();

while (server.State == MongoServerState.Disconnected)
{
   Thread.Sleep(1000);
   try
   { 
      server.Reconnect(); 
   }
   catch (Exception ex)
   { 
      Debug.WriteLine("Failed to connect mongodb {0} Attempt Count: {1}",
                       ex, server.ConnectionAttempt); 
   }
}