Как проверить, что в PyMongo соединение еще живо? - PullRequest
1 голос
/ 23 марта 2012

Как проверить, что в PyMongo соединение еще живо?Есть ли какой-нибудь элегантный способ сделать это или просто попробовать один простой запрос и результаты синтаксического анализа?

Ответы [ 3 ]

6 голосов
/ 25 марта 2012

Я не думаю, что есть элегантный способ. 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
0 голосов
/ 14 декабря 2013

С данным решением у вас будут такие ошибки, как Объект '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
0 голосов
/ 13 марта 2013

В соединении pymongo2.2 в URL есть опция добавления дополнительных параметров:

mongodb://<user>:<password>@<host>:<port>/<db>?options

одна из поддерживаемых опций - connectTimeoutMS, т.е.

mongodb://<user>:<password>@<host>:<port>/<db>?connectTimeoutMS=300

для увеличения времени ожидания соединения до 300 мс

большие версии pymongo имеют аналогичные варианты того же варианта

...