我正在使用当前稳定版本的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。但是,我想知道我是否可以利用连接池自动处理丢失的连接。如果是这样,我的代码需要什么才能使连接池工作?
答案 0 :(得分:3)
已经有连接池正在进行中。套接字的问题在于,在使用套接字之前,您不知道它们是否有效。您必须发送数据以查看连接是否中断。司机偶尔心跳加速,所以我们很有可能会发现连接被破坏并重新开始。但是,很有可能在心跳运行和发现断开的连接之前尝试进行操作。在这种情况下,您将检查我们不知道的连接是否错误,您将获得异常。你唯一能做的就是抓住并重试。
答案 1 :(得分:0)
我发现MongoClientSettings对象用于构建一个ClusterKey,它将一个集群与另一个集群区分开来(在单个实例的情况下甚至是一个集群)。由于群集包含连接池,因此您需要注意不要意外初始化多个群集。
使用单个静态MongoClientSettings帮助我摆脱连接过载。
我选择使用单个MongoClientSettings初始化新的MongoClients,以报告我当前连接到的副本集的哪个服务器。