如何更改由于服务器无法访问而失败的不同操作的超时时间? ({start_session
,insert
,find
,delete
,update
,...)
...
auto pool = mongocxx::pool(mongocxx::uri("bad_uri"), pool_options);
auto connection = pool.try_acquire();
auto db = (*(connection.value()))["test_db"];
auto collection = db["test_collection"];
// This does not help
mongocxx::write_concern wc;
wc.timeout(std::chrono::milliseconds(1000));
mongocxx::options::insert insert_options;
insert_options.write_concern(wc);
// takes about 30 seconds to fail
collection.insert_one(from_json(R"({"name": "john doe", "occupation": "_redacted_", "skills" : "a certain set"})"), insert_options);
[编辑]
这是异常消息:
C ++异常,描述为“找不到合适的服务器:
serverSelectionTimeoutMS
已过期:[连接超时调用 ismaster on'127.0.0.1:27017']
答案 0 :(得分:2)
从insert_one()
操作中查看实际的错误消息会很有帮助,但是“大约需要30秒才能失败”表明这可能是由于默认的服务器选择超时引起的。您可以通过serverSelectionTimeoutMS
连接字符串选项进行配置。
如果要连接到副本集,建议将超时时间保持在预期时间以上,以完成故障转移。 Replica Set Elections声明:
集群选择新的主节点之前的中值时间通常不应超过12秒
您可能会发现实践中的时间较短。通过将服务器选择超时保持在预期的故障转移时间以上,您将允许驱动程序将您的应用程序与错误隔离(以等待时间为代价)。
如果您没有连接到副本集,请随意将serverSelectionTimeoutMS
降低到一个较低的值,尽管它仍然大于mongod
(独立)或mongos
的预期延迟(分片群集)节点。
请注意,由于选择了服务器within a loop,因此connectTimeoutMS
连接字符串选项不会影响您看到的延迟。降低连接超时时间将使驱动程序在尝试连接到无法访问的服务器时内部放弃,但是服务器选择仍将阻止serverSelectionTimeoutMS
(并且可能在该循环中重试与服务器的连接)。 / p>