如何检查PyMongo连接仍然存在?

时间:2012-03-23 10:29:47

标签: python pymongo

如何检查PyMongo连接仍然存在?有没有优雅的方法来做这个或只是尝试一个简单的查询和解析器结果?

3 个答案:

答案 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