繁体   English   中英

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

[英]Mongo C# driver try reconnect on connection failure

有没有使用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由于某种原因而崩溃而导致整个服务崩溃。

根据驱动程序文档的建议,添加了MongoClient来管理副本集内容,这是您MongoClient需要的。 为了避免大规模代码重构,您现在需要更好地利用它。 具有线程安全性的MongoClient已经在副本集节点之间实现了故障转移逻辑。 应该与您的应用程序域一起使用。 因此,您可以注入除db之外的MongoClient(这甚至不是线程安全的)。

因此,请始终从MongoClient重试GetServer()GetDatabase() ,并尝试/捕获它们产生的异常,当MongoDB再次联机时,它们最终将为您提供可用的db对象。
关键是,MongoDB不会将其在线通知客户端,因此也没有此类事件可通知您。 您必须继续在客户端尝试,直到一切正常为止。 为了避免异常降低服务质量,您必须抓住它们。

编辑 :根据文档,我对线程安全性有误。 但是,这不会改变您不应该存储MongoDatabase以便将来迁移到副本集的事实。

除了要翻译答案外,还想做代码段来解决这个问题。

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); 
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM