Тайм-аут OracleConnections? Если нет, то почему мои сессии Oracle (в v $ session) исчезают? - PullRequest
2 голосов
/ 25 февраля 2011

У меня есть приложение WinForms, которое при первом запуске сначала создает OracleConnection, а затем вызывает хранимую процедуру, которая записывает запись в таблицу user_session. OracleConnection - это статический член класса, который намеренно никогда не удаляется, поскольку мы хотим, чтобы соединение существовало на протяжении всего жизненного цикла приложения. По сути, идея состоит в том, чтобы отслеживать, кто использует приложение в любое время. Когда приложение закрывается, оно вызывает другую хранимую процедуру для удаления записи из таблицы user_session.

Это все работает достаточно хорошо, но мы хотели удовлетворить тот редкий (?) Случай, когда приложение падает, и запись в нашей таблице user_session не очищается. Для этого у нас есть другая хранимая процедура, которая проверяет, какие сеансы существуют в представлении Oracle v $ session, и если он находит сеанс в user_session, который не существует в v $ session, он очищает запись в user_session. Это также, кажется, работает довольно хорошо.

Но теперь у нас есть новая служба WCF, размещенная в IIS 6. Она также выполняет ту же логику запуска, что и приложение WinForms - она ​​создает OracleConnection и не удаляет его до тех пор, пока служба не отключится.

И все же по какой-то причине запись этой службы в v $ session исчезает. Это происходит довольно случайно, но довольно регулярно (обычно после нескольких часов работы службы). Это заставляет нашу хранимую процедуру очищать сеанс службы из нашей таблицы user_sessions, когда это не нужно, что я пытаюсь исправить.

Итак, на мой вопрос: У OracleConnections в конечном итоге истекает время, возможно, если они простаивают слишком долго? Если да, то где настроено это время? Если нет, то почему мой сеанс удаляется из v $ session?

Я думал, что если OracleConnection не удаляется, то сеанс (в v $ session) будет зависать бесконечно (или до тех пор, пока процесс не будет остановлен / уничтожен). Похоже, именно так все и работает в приложении WinForms. Но это не наш опыт работы с сервисом WCF: как я уже объяснил, сессия просто исчезает, несмотря на то, что OracleConnection все еще остается открытым. (Я попытался прослушать событие StateChange, на случай, если по какой-то причине OracleConnection закрывался, но событие никогда не срабатывает, поэтому соединение определенно все еще открыто. Мы также настроили IIS, чтобы не завершать незанятые процессы, не как служба закрыта без нашего ведома.)

Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 25 февраля 2011

Будет полезно, если вы упомянули версию oracle rdbms, которую вы используете ....
Кроме того, ситуация в сети может оказать влияние. Используются ли брандмауэры?

Существует несколько причин, по которым простое соединение может быть очищено:

  1. межсетевой экран
  2. профиль пользователя
  3. Тайм-аут менеджера ресурсов

2 и 3 не включены по умолчанию. Если это так, измените его соответствующим образом.

Для 1 вы должны сначала узнать, установлен ли межсетевой экран. Если это так, вы можете включить обнаружение мертвых клиентов. Это должно быть сделано на сервере, и он регулярно отправляет запрос клиенту, чтобы увидеть, присутствует ли он по-прежнему.

Надеюсь, это поможет, Рональд

2 голосов
/ 25 февраля 2011

Проверьте ваш брандмауэр, возможно, он прерывает сеансы через несколько часов.Вы также можете установить параметр SQLNET.EXPIRE_TIME.Это может помочь сохранить сессию открытой.Установите его на несколько минут.Я предполагаю, что .NET использует клиента NET8 ...

...