Ошибка PostgreSQL 08003 connection_does_not_exist: несуществующее соединение
Клиентское приложение пытается отправить SQL-запрос или команду через дескриптор соединения, которое уже было закрыто сервером, пулером соединений или клиентом:
ERROR: connection does not exist
-- либо:
FATAL: client connection has been closed
SQLSTATE: 08003 1. Проверка таймаутов неактивности в postgresql.conf
Сервер PostgreSQL может принудительно закрывать сессии, превысившие лимиты ожидания:
-- Проверка лимитов простоя сессий
SHOW idle_session_timeout;
SHOW idle_in_transaction_session_timeout;Если параметры заданы слишком агрессивно, увеличьте их:
ALTER SYSTEM SET idle_session_timeout = '2h';
SELECT pg_reload_conf();2. Корректировка настроек пула соединений в 1С:Предприятие
В кластере серверов 1С настройте параметры очистки спящих соединений:
- Откройте Консоль администрирования серверов 1С.
- В свойствах информационной базы проверьте параметры:
- Время засыпания пассивных сеансов (рекомендуется не менее 1200 сек);
- Время завершения спящих сеансов (рекомендуется не менее 86400 сек).
3. Настройка PgBouncer (если используется)
В конфигурационном файле pgbouncer.ini проверьте параметры:
[pgbouncer]
server_idle_timeout = 600
client_idle_timeout = 0
query_timeout = 0
suspend_timeout = 104. Обработка переподключения на уровне клиентского кода
При прямой интеграции с базой реализуйте перехват ошибки и переинициализацию соединения:
-- Пример логики повторного подключения при сбое:
BEGIN
-- Выполнение запроса
EXCEPTION WHEN connection_does_not_exist OR sqlclient_unable_to_establish_sqlconnection THEN
-- Реинициализация пула и повтор транзакции
END; Частые вопросы (FAQ)
Почему 08003 возникает при использовании PgBouncer в режиме transaction pooling?
В режиме transaction pool соединение возвращается в общий пул сразу после завершения транзакции. Если клиент пытается выполнить команду вне транзакционного контекста в старый дескриптор, генерируется ошибка отсутствия соединения.
Как очистить «мертвые» сеансы в базе 1С без перезагрузки кластера?
В консоли администрирования 1С перейдите в раздел 'Сеансы', выберите неактивные сеансы с признаком 'Спящий' и вызовите команду 'Удалить'.
Может ли антивирус или EDR блокировать соединения и вызывать 08003?
Да, средства глубокого анализа трафика (DPI/SSL Inspection/EDR) могут принудительно разрывать длительные TCP-сессии между сервером 1С и СУБД, интерпретируя их как аномальную активность.
Как зафиксировать момент разрыва соединения в журнале PostgreSQL?
Включите в postgresql.conf параметры: log_connections = on и log_disconnections = on. В журнале будет точно указано время и причина отключения клиента.