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,以便报告我当前连接到副本集的哪个服务器。
我使用的是 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,以便报告我当前连接到副本集的哪个服务器。