【问题标题】:MongoDB C# Driver connection poolingMongoDB C# 驱动程序连接池
【发布时间】:2015-03-23 11:18:13
【问题描述】:

我正在使用 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,尝试重新连接,然后重试 Save。但是,我想知道是否可以利用连接池为我自动处理丢失的连接。如果是这样,我的代码需要什么样的连接池才能工作?

【问题讨论】:

  • 提供有关错误的详细信息。还要检查stackoverflow.com/questions/7446528/…
  • 这个错误并不是特别相关 - 它失去了与我的数据库机器的连接,这种情况会不时发生。我只是想知道最好的处理方法是什么,以及是否可以使用连接池而不是自己编写重新连接逻辑。

标签: mongodb mongodb-.net-driver


【解决方案1】:

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

【讨论】:

  • 谢谢,我想会是这样。我不确定在使用连接池时是否会在某处构建“尝试,否则重新连接和重试失败”。我认为我上面的代码没有利用任何连接池的使用,因为它只连接一次。大概我必须将连接逻辑带入 Insert 方法中才能这样做?
  • 不,你不需要做任何事情来获得连接池。它总是在那里。你的代码完全没问题。如果您只是重试(并且服务器已备份),那么下一次尝试将成功。可能会有一点延迟,但您不需要“重新连接”。
  • 克雷格·威尔逊,谢谢。巴士这个行为太神奇了,你需要把它写在文档中,拜托。
  • 我认为这里记录了这一点:mongodb.github.io/mongo-csharp-driver/2.2/reference/driver/…,可能不像这个特殊情况那么具体,但它确实存在。
【解决方案2】:

我发现 MongoClientSettings 对象用于构建一个 ClusterKey 来区分一个集群与另一个集群(在单个实例的情况下甚至是一个集群)。由于集群包含连接池,因此您需要注意不要意外初始化多个集群。

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

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

【讨论】:

    猜你喜欢
    • 2021-06-05
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多