Если есть способ заставить каждое новое соединение выполнять запрос во время соединения, вы можете написать функцию базы данных, которая динамически вызывает «pg_terminate_backend (pid)» для любых процессов, которые находятся в некоторых критериях. Не зная вашей настройки, некоторые возможности:
- Соединения с current_query = 'в транзакции' и CURRENT_TIMESTAMP - query_start () больше некоторого значения (от 1 минуты до 5 минут?)
- Соединения с вашего IP-адреса или индивидуального имени пользователя (если есть), которые вы в данный момент не используете (хотя, вероятно, не очень хорошая идея в средах с пулами соединений)
Лично я бы попытался провести рефакторинг, чтобы минимизировать время, в течение которого любая транзакция может быть открыта. В некоторых местах, где транзакция может быть открыта без необходимости, повышается вероятность возникновения вашей проблемы:
- ORM работает с выключенным AutoCommit.
- LOCK используется, когда данные считываются для экрана редактирования, поэтому данные не могут быть обновлены до их обратной записи. Может быть приемлемо проверить, прежде чем написать, что конфликта нет.
- Транзакции начались перед задачей, не связанной с базой данных, например, процессом FTP или электронной почтой, а затем были закрыты.
- Транзакции, в которых самым первым оператором является SELECT без предложения блокировки (например, «FOR UPDATE»). Результат этого SELECT будет одинаковым независимо от того, находится он внутри или вне транзакции, поэтому это показатель того, что транзакция была начата слишком рано и может быть сокращена.
- Транзакции, которые содержат только одно утверждение любого вида.