如何检查PyMongo连接仍然存在?有没有优雅的方法来做这个或只是尝试一个简单的查询和解析器结果?
答案 0 :(得分:6)
我认为没有一种优雅的方式。 Pymongo有AutoReconnect异常,如果之前建立的连接丢失,将抛出异常。您应该捕获此异常并重试将导致重新建立连接的操作。
一种相对无痛的方法来处理我发现的AutoReconnects是在单独的方法中隔离数据库操作并用类似于此的装饰器包装它们:
from pymongo.errors import AutoReconnect
def autoreconnect_retry(fn, retries=3):
def db_op_wrapper(*args, **kwargs):
tries = 0
while tries < retries:
try:
return fn(*args, **kwargs)
except AutoReconnect:
tries += 1
raise Exception("No luck even after %d retries" % retries)
return db_op_wrapper
用法:
@autoreconnect_retry
def insert_foo_record(foo):
# Perform db operation
pass
@autoreconnect_retry(20)
def get_foo_record(id):
# Perform db operation
pass
答案 1 :(得分:0)
在pymongo2.2连接中,url可以选择添加其他参数:
mongodb://<user>:<password>@<host>:<port>/<db>?options
支持的选项之一是connectTimeoutMS即
mongodb://<user>:<password>@<host>:<port>/<db>?connectTimeoutMS=300
为了将连接超时延长到300ms
更大版本的pymongo具有相同选项的相似变体
答案 2 :(得分:0)
根据给出的解决方案,您将遇到错误,如'NoneType'对象不可调用,或* autoreconnect_retry()至少需要1个参数(给定1个)*。在这里,您已经测试并运行了代码来装饰执行pymongo操作的所有方法,基于kristaps答案:
from pymongo.errors import AutoReconnect
def autoreconnect_retry(retries=3):
"""
Decorator for connection retrial in mongoDB
"""
def autoreconnect_retry_decorator(fn):
def db_op_wrapper(*args, **kwargs):
tries = 0
while tries < retries:
try:
return fn(*args, **kwargs)
except AutoReconnect:
tries += 1
raise Exception("No luck even after %d retries" % retries)
return db_op_wrapper
return autoreconnect_retry_decorator
然后你可以用上面提到的参数装饰方法:
@autoreconnect_retry
def some_pymongo_operation():
pass
@autoreconnect_retry(20)
def some_pymongo_operation():
pass