MongoDB C#驱动程序连接池

MongoDB C#驱动程序连接池,mongodb,mongodb-.net-driver,Mongodb,Mongodb .net Driver,我正在使用当前稳定版本的MongoDB C#驱动程序。我有一个长期运行的服务,基本上是从外部源读取数据并将其全部写入MongoDB数据库 目前,我通过在启动时连接MongoDB来处理这个问题 void Connect() { var client = new MongoClient("(url)"); var server = client.GetServer(); var db = server.GetDatabase("(db-name)"); this.co

我正在使用当前稳定版本的MongoDB C#驱动程序。我有一个长期运行的服务,基本上是从外部源读取数据并将其全部写入MongoDB数据库

目前,我通过在启动时连接MongoDB来处理这个问题

void Connect()
{
    var client = new MongoClient("(url)");
    var server = client.GetServer();
    var db = server.GetDatabase("(db-name)");
    this.coll = db.GetCollection("(collection-name)");
}
然后,每当我得到一些数据时,我就会:

void Insert(object data)
{
    this.coll.Save(data);
}
除了与MongoDB的连接出现故障之外,这一切都可以正常工作。然后,我在Save调用中发现一个IOException


所以我想给它增加一些弹性,自然的做法是捕获IOException,尝试重新连接,然后重试保存。但是,我想知道是否可以利用连接池自动处理丢失的连接。如果是这样,我的代码需要什么样的外观才能使连接池正常工作?

已经有一个连接池正在运行。套接字的问题是,在使用它们之前,您不知道它们是否工作。您必须发送数据以查看连接是否中断。驱动程序偶尔会心跳,因此我们很有可能会发现连接中断并重新启动。但是,您很有可能在心跳运行和发现断开的连接之前尝试执行操作。在本例中,您将检查一个我们不知道的连接是否坏,并将得到一个异常。您唯一能做的就是捕获并重试。

我发现MongoClientSettings对象用于构建一个ClusterKey,它可以区分一个集群和另一个集群(即使是单个实例中的一个集群)。由于集群包含连接池,因此需要注意多个集群没有被意外初始化

使用单个静态MongoClientSettings帮助我摆脱了连接过载


我选择使用单个MongoClient设置初始化新的MongoClient,以便报告我当前连接到的复制集的哪个服务器。

提供有关错误的详细信息。另外,请检查错误是否特别相关-它与我的数据库计算机失去了连接,这将不时发生。我只是想知道处理这个问题的最佳方法是什么,以及是否可以利用连接池,而不是自己编写重新连接逻辑。谢谢,我想应该是这样的。我不确定在使用连接池时,是否会在某个地方内置“try,else reconnect&retry else fail”。我不认为我上面的代码利用了连接池的任何用途,因为它只连接一次。大概我必须将连接逻辑引入Insert方法才能这样做?不,不需要做任何事情来获得连接池。它总是在那里。你的代码是完美的。如果您只是重试(并且服务器已备份),那么下一次尝试将成功。也许有点延迟,但你不需要“重新连接”。克雷格·威尔逊,谢谢。Bus这个bahavior很神奇,你需要在文档中写出来。我想这里有记录:,也许没有这个特殊的案例那么具体,但它肯定在那里。