Oracle: как определить завершение клиентского процесса, как это работает для sqlplus?


У меня есть следующая проблема в моем приложении, которое подключается к базе данных Oracle 10g:

Когда мой клиент выходит из строя, или процесс завершается через Диспетчер задач, или клиент теряет соединение на некоторое время, соответствующая запись в представлении сеанса v$остается.

Теперь, когда я подключаюсь к базе данных с помощью sqlplus, и я убиваю sqlplus.exe через Диспетчер задач, запись сеанса удаляется почти мгновенно.

Последнее поведение было бы предпочтительнее для моего применение по разным причинам.

Что sqlplus делает по-другому, и могу ли я сделать это также в моем собственном приложении(приложениях)?

3 4

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 работать.