lamo4ok
@lamo4ok
Программист

Как избавиться от ошибки с prepared statement при работе с PostgreSQL через PgBouncer?

Иногда возникает примерно такая ошибка при попытке сделать запрос в коде:

Invalid sql statement name: 7 ERROR: prepared statement "некое имя" does not exist

База данных живет на удаленном сервере, PgBouncer в контейнере Docker, приложение тоже.
Есть ощущение, что PgBouncer подготавливает выражение для ускорения работы при первом запуске, но после остановки выполнения где-то на середине и последующего запуска, PgBouncer все еще считает, что выражение должно остаться на сервере, а вот сервер уже так не думает.

Как этого можно избежать, или как это можно лечить?
  • Вопрос задан
  • 921 просмотр
Пригласить эксперта
Ответы на вопрос 1
Melkij
@Melkij
PostgreSQL DBA
Есть ощущение, что PgBouncer подготавливает выражение для ускорения работы при первом запуске, но после остановки выполнения где-то на середине и последующего запуска, PgBouncer все еще считает, что выражение должно остаться на сервере, а вот сервер уже так не думает.

Замените слово "PgBouncer" на "ваше приложение" и тогда получите относительно верное описание происходящего.

С практически 100% вероятностью у вас pgbouncer сконфигурирован в режиме transaction pool mode. А выполнение любого нового запроса в extended protocol (prepared statement) состоит из трёх вызовов:
- prepare
- bind
- execute
Нет ничего ошибочного в том, что pgbouncer сконфигурированный в режиме пула транзакций может направить каждое из этих 3 сообщений в разные коннекты базы. Это прямым текстом задокументированное ограничение пула транзакций. Итог закономерный, соответствующие процессы базы не понимают о чём речь и выражают удивление такими ошибками.

Отключите использование server-side prepared statements на приложении.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы