PostgreSQL 9.3 простаивает в транзакции - PullRequest
0 голосов
/ 11 октября 2019

В нашем продукте иногда возникает ситуация, когда база данных заблокирована с помощью соединения idle in transaction.

Я использую postgresql-9.3 (9.4), соединение java через драйвер jdbc.
Все соединениянастроены на автокоммит.

Проблема может быть решена только с помощью SELECT pg_terminate_backend(PID). Мне не нравится такое решение, но единственное, что работает, - это перезапуск службы.

Поэтому возникает вопрос, как решить такую ​​проблему, когда я не манипулирую транзакциями вручную. Все подключения к Postgres являются локальными, поэтому я не думаю, что это проблема сети.

Обновление Все верно, без сомнения - есть ошибка приложения.

Представьте себе,что у нас есть запрос:

try(PreparedStatement statement=connection.prepareStatement("update table1 set some_field=1 where id=2")){
    statement.executeUpdate();
}

Итак, простой запрос для локального соединения. Соединение активно. Автокоммит это правда. Какая проблема должна возникнуть для такого соединения, чтобы оно было idle in transaction?

Обновление Спасибо всем за внимание. Проблема была решена путем замены jdbc-драйвера на последнюю версию.

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Спасибо всем за внимание. Проблема была решена путем изменения jdbc-драйвера до последней версии.

0 голосов
/ 11 октября 2019

Транзакции, которые остаются в статусе idle in transaction в течение длительного времени, являются ошибкой приложения, но вы, вероятно, знаете об этом.

Одним из «решающих» «решений» проблемы является установка idle_in_transaction_session_timeoutк ненулевому значению. Этот параметр доступен начиная с версии 9.6, что дает вам еще одну прекрасную причину для обновления до последней версии в ближайшее время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...