Oracle: как определить завершение клиентского процесса, как это работает для sqlplus?
У меня есть следующая проблема в моем приложении, которое подключается к базе данных Oracle 10g:
Когда мой клиент выходит из строя, или процесс завершается через Диспетчер задач, или клиент теряет соединение на некоторое время, соответствующая запись в представлении сеанса v$остается.
Теперь, когда я подключаюсь к базе данных с помощью sqlplus, и я убиваю sqlplus.exe через Диспетчер задач, запись сеанса удаляется почти мгновенно.
Последнее поведение было бы предпочтительнее для моего применение по разным причинам.
Что sqlplus делает по-другому, и могу ли я сделать это также в моем собственном приложении(приложениях)?
3 ответа:
SQL * Plus использует интерфейс вызовов OCI-Oracle. Это обширный API (более четырехсот вызовов функций. OCI предоставляет множество методов для обработки соединений и сеансов. Я не знаю наверняка, но я бы предположил, что SQL * Plus использует OCILogon2 () для регистрации выделенного сеанса для пользователя и помещает что-то в дескриптор сеанса, который позволяет ему обнаруживать, когда сеанс прекращается.
Таким образом, вероятно, ваше приложение не использует OCI для подключения базы данных. Если вы хотите знать больше о OCI вы можете прочитать в документах. Имейте в виду, что это довольно низкоуровневый материал! Узнайте больше.
Вы можете установить
sqlnet.expire_time=minutes_to_check
в$ORACLE_HOME/network/admin/sqlnet.ora
; это не будет мгновенным, как oci, но это очистит мертвые соединения.
Дальнейшее исследование показало, что хотя sqlplus действительно ведет себя по-разному при отключении процесса, на самом деле он ведет себя так же, когда сетевой кабель отключен на секунду => висячий сеанс останется на сервере.
Теперь я создал профиль пользователя с ограниченным
idle_time
, который назначается нужным мне пользователям. Фоновый поток отправляет запросы "keepalive", чтобы сохранить соединение отSNIPED
PM.Смотрите мой другой вопрос Oracle: idle_time кажется, игнорируется , Если вы заинтересованы в том, что я сделал, и видите ответ на то, что вы должны сделать, чтобы заставить
idle_time
работать.