特别是,我目前正在try 使用以下函数判断与客户端的连接是否有效:

def mongodb_connect(client_uri):
    try:
        return pymongo.MongoClient(client_uri)
    except pymongo.errors.ConnectionFailure:
         print "Failed to connect to server {}".format(client_uri)

然后我像这样使用这个函数:

def bucket_summary(self):
    client_uri = "some_client_uri"
    client = mongodb_connect(client_uri)
    db = client[tenant_id]
    ttb = db.timebucket.count() # If I use an invalid URI it hangs here

如果给出了无效的URI,是否有方法在最后一行捕获并抛出异常?我最初以为这就是ConnectionFailure的目的(因此在连接时可以捕捉到这一点),但我错了.

如果我用一个无效的URI运行程序,该URI无法运行,则发出键盘中断会产生:

File "reportjob_status.py", line 58, in <module>
tester.summarize_timebuckets()
File "reportjob_status.py", line 43, in summarize_timebuckets
ttb = db.timebucket.count() #error
File "/Library/Python/2.7/site-packages/pymongo/collection.py", line   1023, in count
return self._count(cmd)
File "/Library/Python/2.7/site-packages/pymongo/collection.py", line 985, in _count
with self._socket_for_reads() as (sock_info, slave_ok):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/contextlib.py", line 17, in __enter__
return self.gen.next()
File "/Library/Python/2.7/site-packages/pymongo/mongo_client.py", line 699, in _socket_for_reads
with self._get_socket(read_preference) as sock_info:
File  "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/contextlib.py", line 17, in __enter__
return self.gen.next()
File "/Library/Python/2.7/site-packages/pymongo/mongo_client.py", line 663, in _get_socket
server = self._get_topology().select_server(selector)
File "/Library/Python/2.7/site-packages/pymongo/topology.py", line 121, in select_server
address))
File "/Library/Python/2.7/site-packages/pymongo/topology.py", line 106, in select_servers
self._condition.wait(common.MIN_HEARTBEAT_INTERVAL)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 358, in wait
_sleep(delay)

推荐答案

serverSelectionTimeoutMS关键字参数pymongo.mongo_client.MongoClient控制驱动程序try 连接到服务器的时间.默认值为30秒.

将其设置为与典型连接时间兼容的非常低的值,以便立即报告错误.之后需要查询数据库以触发连接try :

>>> maxSevSelDelay = 1 # Assume 1ms maximum server selection delay
>>> client = pymongo.MongoClient("someInvalidURIOrNonExistantHost",
                                 serverSelectionTimeoutMS=maxSevSelDelay)
//                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>> client.server_info()

这将筹集pymongo.errors.ServerSelectionTimeoutError美元.

1 ApparentlyserverSelectionTimeoutMS设置为0甚至可能在您的服务器延迟非常低的特定情况下工作(例如,负载非常轻的"本地"服务器)


这取决于你如何捕捉这个异常并正确处理它.like件事:

try:
    client = pymongo.MongoClient("someInvalidURIOrNonExistantHost",
                                     serverSelectionTimeoutMS=maxSevSelDelay)
    client.server_info() # force connection on a request as the
                         # connect=True parameter of MongoClient seems
                         # to be useless here 
except pymongo.errors.ServerSelectionTimeoutError as err:
    # do whatever you need
    print(err)

将显示:

No servers found yet

Mongodb相关问答推荐

Spring Data MongoDB中的@ Transactions(+测试容器)

如何拉平mongo DB中的对象并在根目录中保存时有条件地重命名字段?

如何从MongoDB集合中获取第一个和最后一个元素?

GO:如何在MongoDB中区分空字符串和nil

MongoDb聚合查询问题

Mongo,通过 Lookup 计算多个文档中数组中的项目

我可以在 MongoDB 中将字段值设置为对象键吗?

如何在 MongoDB 中对字段进行自定义排序

$lookup 的参数必须是字符串

MongoDB中的readPreference和readConcern有什么区别?

如何在 Mongo 聚合管道中获取限制之前的计数

删除嵌套文档数组中的嵌入文档

mongodb,pymongo,aggregate聚合给出奇怪的输出

MongoDB插入引发重复键错误

如何在任意深度查找 MongoDB 字段名称

在 GridFS、express、mongoDB、node.js 中存储来自 POST 请求的数据流

REACT 获取发布请求

Flask:设置应用程序和请求特定的属性?

MongoDB MapReduce - 发出一个键/一个值不调用reduce

MongoDB 查询:字段不存在或具有特定值