Oracle: Как обнаружить завершение процесса клиента, как это работает для sqlplus? - PullRequest
4 голосов
/ 09 марта 2012

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

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 09 марта 2012

SQL * Plus использует OCI - интерфейс вызова Oracle.Это обширный API (более четырехсот вызовов функций. OCI предоставляет множество методов для обработки соединений и сессий. Я не знаю наверняка, но я предполагаю, что SQL * Plus использует OCILogon2 () для регистрации выделенного сеанса для пользователя,и помещает что-то в дескриптор сеанса, что позволяет ему определять, когда сеанс ABENDs.

Итак, вероятно, ваше приложение не использует OCI для подключения к базе данных. Если вы хотите узнать больше об OCI, вы можете прочитатьdocs. Имейте в виду, что это довольно низкоуровневый материал! Узнайте больше.

1 голос
/ 15 марта 2012

Дальнейшие исследования показали, что, несмотря на то, что sqlplus ведет себя по-разному при уничтожении процесса, фактически он ведет себя так же, когда сетевой кабель отключается на секунду => Сеанс зависания будет оставаться на сервере.

Я сейчас создал профиль пользователя с ограниченным idle_time, который назначается нужным пользователям. Фоновый поток отправляет запросы keepalive, чтобы PMON не установил соединение SNIPED.

См. Мой другой вопрос Oracle: idle_time, кажется, игнорируется , если вы заинтересованы в том, что я сделал, и видите ответ о том, что вы должны сделать, чтобы idle_time заработал.

1 голос
/ 09 марта 2012

Вы можете установить sqlnet.expire_time=minutes_to_check в $ORACLE_HOME/network/admin/sqlnet.ora; он не будет мгновенным, как OCI, но он очистит мертвые соединения.

...