MongoDB C# 驱动程序连接池

MongoDB C# Driver connection pooling

我使用的是 MongoDB C# 驱动程序的当前稳定版本。我有一个 long-运行 服务,本质上是从外部源读取数据并将其全部写入 [​​=23=] 数据库。

目前,我通过在启动时连接到 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 帮助我摆脱了连接过载。

我选择使用单个 MongoClientSettings 初始化新的 MongoClients,以便报告我当前连接到副本集的哪个服务器。