Как реализовать обратный вызов на событие сброса подключения с помощью SQLObject?

Я использую скрипт Python, который выполняет определенный контроль потока в наших исходящих почтовых сообщениях, в основном проверяя, отправляет ли пользователь спам.

Скрипт устанавливает постоянное соединение с базой данных через SQLObject, При определенных обстоятельствах соединение сбрасывается третьей стороной (например, наш межсетевой экран закрывает соединение из-за чрезмерного простоя), и SQLObject не замечает, что он был закрыт, и продолжает отправлять запросы на неработающий обработчик TCP, что приводит к таким записям в журнале:

Feb 06 06:56:07 mailsrv2 flow: ERROR Processing request error: [Failure instance: Traceback: <class 'psycopg2.InterfaceError'>: connection already closed#012/usr/lib/python2.7/threading.py:524:__bootstrap#012/usr/lib/python2.7/threading.py:551:__bootstrap_inner#012/usr/lib/python2.7/threading.py:504:run#012--- <exception caught here>---#012
/opt/scripts/virtualenv/local/lib/python2.7/site-packages/twisted/python/threadpool.py:191:_worker#012
/opt/scripts/virtualenv/local/lib/python2.7/site-packages/twisted/python/context.py:118:callWithContext#012
/opt/scripts/virtualenv/local/lib/python2.7/site-packages/twisted/python/context.py:81:callWithContext#012
/opt/scripts/flow/server.py:91:check#012
/opt/scripts/flow/flow.py:252:check#012
/opt/scripts/flow/flow.py:155:append_to_log#012
/opt/scripts/virtualenv/local/lib/python2.7/site-packages/SQLObject-1.3.1-py2.7.egg/sqlobject/main.py:1226:__init__#012
/opt/scripts/virtualenv/local/lib/python2.7/site-packages/SQLObject-1.3.1-py2.7.egg/sqlobject/main.py:1274:_create#012
/opt/scripts/virtualenv/local/lib/python2.7/site-packages/SQLObject-1.3.1-py2.7.egg/sqlobject/main.py:1298:_SO_finishCreate#012
/opt/scripts/virtualenv/local/lib/python2.7/site-packages/SQLObject-1.3.1-py2.7.egg/sqlobject/dbconnection.py:468:queryInsertID#012
/opt/scripts/virtualenv/local/lib/python2.7/site-packages/SQLObject-1.3.1-py2.7.egg/sqlobject/dbconnection.py:327:_runWithConnection#012
/opt/scripts/virtualenv/local/lib/python2.7/site-packages/SQLObject-1.3.1-py2.7.egg/sqlobject/postgres/pgconnection.py:191:_queryInsertID#012]

Это заставляет меня думать, что действительно должен быть какой-то обратный вызов для такой ситуации, иначе эта запись в журнале не будет записана. Я бы использовал этот обратный вызов, чтобы установить новое соединение с базой данных. Я не смог найти какой-либо документации об этом.

Кто-нибудь знает, возможно ли вообще реализовать этот обратный вызов и как его объявить?

Благодарю.

1 ответ

Решение

Мы более постоянные пользователи SQLAlchemy скорее, чем SQLObject, Согласно этой теме за 2010 год ( http://sourceforge.net/p/sqlobject/mailman/message/26460439), SQLObject не поддерживает логику переподключения для PostgreSQL. Это старый поток, но, похоже, нет никаких дискуссий по поводу решения этой проблемы в SQLObject.

У меня есть три предложенных решения.

Первое решение состоит в том, чтобы исследовать пулы соединений. Это может обеспечить способ открыть новый объект подключения, когда SQLObject обнаруживает, что psycopg2 отключен. Я не могу гарантировать, что это произойдет, но если это произойдет, это решение будет вашим лучшим, так как оно требует наименьшего количества изменений с вашей стороны.

Второе решение - переключить ваш бэкэнд с Postgres на MySQL. Документы SQLObject предоставляют информацию о том, как использовать логику переподключения драйвера mysql - http://sourceforge.net/p/mysql-python/feature-requests/9

Третье решение - переключиться на SQLAlchemy в качестве ORM и использовать их версию пулов подключений. Согласно документации основного события, при использовании пулов, если соединение разорвано или закрыто, будет открыто новое соединение - http://docs.sqlalchemy.org/en/rel_0_9/core/exceptions.html

Удачи

Другие вопросы по тегам