При выполнении обновления конфигурации базы данных в клиент-серверном варианте администраторы нередко сталкиваются с ситуацией, когда платформа выдает сообщение о невозможности получения монопольного доступа из-за активных сеансов. При этом количество блокирующих соединений, указанное в ошибке, существенно превышает число реальных подключений, видимых через стандартную консоль администрирования кластера серверов 1С:Предприятия. Рассмотрим подробнее, почему возникает такое расхождение и как исправить проблему без постоянной перезагрузки системной службы сервера.
Проанализируем внутренние механизмы взаимодействия клиентских приложений, сервера 1С и СУБД:
rphost с сервером СУБД. Платформа активно использует механизм пула соединений (connection pooling). Даже когда пользователь завершил работу или фоновое задание отработало, физическое подключение к СУБД может удерживаться процессом rphost еще некоторое время.rphost, пул соединений становится общим для них. В этом случае соединения других баз могут учитываться сервером при попытке монопольной блокировки рабочей базы.Разберем по шагам наиболее эффективный способ устранения фантомных соединений в многопользовательской среде:
rphost, что исключит конфликт пулов соединений и удерживание блокировок соседними базами данных.Чтобы избежать блокировок со стороны фоновых заданий и пользователей во время реструктуризации данных, выполним регламентную процедуру:
AdminUpdate).
1cv8.exe DESIGNER /IBConnectionString "..." /UC "AdminUpdate"
Если после завершения сеансов физические блокировки в базе данных продолжают удерживаться, проанализируем состояние транзакций непосредственно на сервере СУБД.
В среде Microsoft SQL Server выявим блокирующие сессии системной процедурой sp_who2 или через системные представления, после чего завершим зависший процесс командой:
-- Завершение зависшей сессии по ее SPID
KILL 58;
В среде PostgreSQL найдем идентификаторы процессов (PID) и принудительно разорвем их соединение с целевой базой:
-- Принудительное завершение всех сессий к указанной базе
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'TradeManagement'
AND pid <> pg_backend_pid();
Для предотвращения накопления утечек памяти и зависания неактивных пулов соединений в процессе регулярной эксплуатации настроим параметры кластера 1С:
rphost (например, 86400 секунд — раз в сутки в нерабочее время). Кластер запустит новые процессы для свежих сеансов и плавно остановит старые по мере завершения текущих задач.