MongoDB C#驱动程序连接池

时间:2015-03-23 11:18:13

标签: 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.coll = db.GetCollection("(collection-name)");
}

然后每当我得到一些数据时,我都会这样做:

void Insert(object data)
{
    this.coll.Save(data);
}

除了与MongoDB连接失败的奇怪场合外,这一切都运行正常。然后我在Save调用上发生IOException。

所以我想为此添加一些弹性,自然要做的就是捕获IOException,尝试重新连接,然后重试Save。但是,我想知道我是否可以利用连接池自动处理丢失的连接。如果是这样,我的代码需要什么才能使连接池工作?

2 个答案:

答案 0 :(得分:3)

已经有连接池正在进行中。套接字的问题在于,在使用套接字之前,您不知道它们是否有效。您必须发送数据以查看连接是否中断。司机偶尔心跳加速,所以我们很有可能会发现连接被破坏并重新开始。但是,很有可能在心跳运行和发现断开的连接之前尝试进行操作。在这种情况下,您将检查我们不知道的连接是否错误,您将获得异常。你唯一能做的就是抓住并重试。

答案 1 :(得分:0)

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

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

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