Версия postgres: PostgreSQL 14.13 (Homebrew) на x86_64-apple-darwin23.6.0, скомпилированная Apple clang версии 16.0.0 ( clang-1600.0.26.4), 64-разрядная версия
У меня есть длительный процесс (возможно, несколько месяцев), который прослушивает уведомления о соединении с базой данных с помощью conn.notify() (см. документацию psycopg3). В документации не указано ожидаемое поведение, если прослушивающее соединение перестает отвечать на запросы или повреждается, поэтому я полагаю, что мне необходимо выполнить проверку работоспособности самостоятельно.
Если conn. notifices() гарантированно вызовет исключение, если с соединением возникнут проблемы, тогда все остальное является спорным. Кто-нибудь знает?
Предполагая, что conn.notify() не обязательно вызывает исключение, в этом комментарии github говорится, что я могу выполнить оператор прослушивающего соединения без потери уведомлений.< /p>
Если вам нужно выполнить новый LISTEN для этого соединения, вы можете остановить генератор уведомлений (используя генераторы. close(), см. документацию), выполнить оператор и вызвать уведомления. () снова. При этом вы не потеряете сообщения: они в любом случае будут буферизованы в соединении libpq.
Код: Выделить всё
def _listen_for_notifications():
with psycopg.Connection.connect("some_connection_string", autocommit=True) as conn:
listen_sql = sql.SQL("LISTEN {}").format(sql.Identifier("some_channel_name"))
conn.execute(listen_sql)
gen = conn.notifies(timeout=5)
print('listening')
# This prints notifications sent within the five second timeout
for n in gen:
print(n)
gen.close() # I see the same behavior with and without this line.
print("Performing health check")
# Any notifications sent over these three seconds are lost
conn.execute("select pg_sleep(3)") # Would be SELECT 1 in real code
conn.execute(listen_sql)
gen = conn.notifies(timeout=5)
print('listening again on the same connection')
# This prints notifications sent within the five second timeout
for n in gen:
print(n)
print('done!')
_listen_for_notifications()
Код: Выделить всё
listening
Notify(channel='some_channel_name', payload='1', pid=35237)
Performing health check
listening again on the same connection
Notify(channel='some_channel_name', payload='3', pid=35237)
done!
Подробнее здесь: https://stackoverflow.com/questions/792 ... alth-check
Мобильная версия