Установка времени ожидания сеанса Oracle 11g - PullRequest
9 голосов
/ 29 июля 2010

После перезагрузки сервера соединение оракула с сервера Tomcat истекает каждую ночь.До перезагрузки время соединения не истекло.Теперь утром приложение выдает ошибку соединения JDBC при доступе к БД.Перезапуск Tomcat устраняет проблему.Я предполагаю, что это связано с восстановлением связей.Я думаю, это связано с тем, что БД Oracle остановил сеанс.Как можно отключить тайм-аут сеанса в Oracle 11g?
Спасибо!
Стив

Config.groovy с опцией dev и test.

dataSource {
  pooled = true
}

hibernate {
   cache.use_second_level_cache = true
   cache.use_query_cache = true
   cache.provider_class = 'net.sf.ehcache.hibernate.EhCacheProvider'
}

// environment specific settings
environments {
production {
  dataSource {
    driverClassName = "oracle.jdbc.driver.OracleDriver"
    username = "XXXXX"
    password = "XXXXXX"
    dialect = "org.hibernate.dialect.Oracle10gDialect"
    dbCreate = "update" // one of 'create', 'create-drop','update'
    url = "jdbc:oracle:thin:@XXXXXX:1521:xxxx"
  }
}  }

Ответы [ 6 ]

14 голосов
/ 29 июля 2010

Обычно это зависит от профиля, связанного с пользователем, к которому Tomcat подключается как.

SQL> SELECT PROFILE, LIMIT FROM DBA_PROFILES WHERE RESOURCE_NAME = 'IDLE_TIME';

PROFILE                        LIMIT
------------------------------ ----------------------------------------
DEFAULT                        UNLIMITED

SQL> SELECT PROFILE FROM DBA_USERS WHERE USERNAME = USER;

PROFILE
------------------------------
DEFAULT

Таким образом, пользователь, к которому я подключен, имеет неограниченное время простоя - нет времени ожидания.

3 голосов
/ 13 августа 2010

Вероятно, это связано с пулом соединений вашего приложения;не проблема СУБД Oracle.У большинства пулов соединений есть оператор проверки, который можно выполнить перед тем, как предоставить вам соединение.В oracle вы хотели бы выбрать «Select 1 from dual».

Причина, по которой это произошло после перезапуска сервера, заключается в том, что пул соединений, вероятно, был добавлен без перезапуска, и вы только что испытываете использование соединениябассейн в первый раз.Каковы даты изменения файлов ресурсов, связанных с подключениями к базам данных?

Пример проверки запроса:

 <Resource name="jdbc/EmployeeDB" auth="Container" 
            validationQuery="Select 1 from dual" type="javax.sql.DataSource" username="dbusername" password="dbpassword"
            driverClassName="org.hsql.jdbcDriver" url="jdbc:HypersonicSQL:database"
            maxActive="8" maxIdle="4"/>

РЕДАКТИРОВАНИЕ: В случае Grails существуютаналогичные параметры конфигурации для бассейна Grails.Пример для Grails 1.2 (см. Примечания к выпуску Grails 1.2 )

dataSource {
    pooled = true
    dbCreate = "update"
    url = "jdbc:mysql://localhost/yourDB"
    driverClassName = "com.mysql.jdbc.Driver"
    username = "yourUser"
    password = "yourPassword"
    properties {
        maxActive = 50
        maxIdle = 25
        minIdle = 5
        initialSize = 5
        minEvictableIdleTimeMillis = 60000
        timeBetweenEvictionRunsMillis = 60000
        maxWait = 10000     
    }   
}
3 голосов
/ 13 августа 2010

Адам уже предложил профили базы данных.

Вы можете проверить файл SQLNET.ORA.Существует параметр EXPIRE_TIME , но он предназначен для обнаружения потерянных соединений, а не для завершения существующих.

Учитывая, что это происходит в одночасье, это больше похоже на тайм-аут простоя, который может быть вплоть до межсетевого экранамежду сервером приложений и сервером базы данных.Установка EXPIRE_TIME может остановить это (так как каждые 10 минут будет проверяться, жив ли клиент).

Или, возможно, база данных закрывается и перезапускается, и это убиваетсвязи.

Кроме того, вы можете настроить tomcat на validationQuery , чтобы он автоматически перезапускал соединение без перезагрузки tomcat

2 голосов
/ 24 сентября 2015

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

Кажется, это возможно, установив пул запрос проверки в

select 1 from V$SESSION 
where AUDSID = userenv('SESSIONID') and sysdate-LOGON_TIME < 30/24/60

Это приведет к закрытию сеансов, устаревших в течение 30 минут.в предсказуемой манере, которая не влияет на приложение.

0 голосов
/ 13 августа 2010

Проверьте подключение приложений к настройкам пула, а не изменяйте какие-либо настройки тайм-аута сеанса в Oracle Ob.Это нормально, что время ожидания истекло.

Посмотрите здесь: http://grails.org/doc/1.0.x/guide/3.%20Configuration.html#3.3%20The%20DataSource

Вы уверены, что правильно установили параметр "pooled"?

Привет, Ларс


РЕДАКТИРОВАТЬ:
Ваш конфиг выглядит нормально при первом взгляде.Я столкнулся с этим вопросом сегодня.Возможно, это связано с вашей болью:
«Бесконечный цикл исключений, если приложение запускается, когда база данных не работает из-за обслуживания» *

0 голосов
/ 12 августа 2010

БД знает, что соединение разорвано, или сеанс все еще указан в v $ session? Я думаю, это указывало бы на то, что это сбрасывается сетью. Знаете ли вы, как долго он может простаивать, прежде чем столкнуться с проблемой, и если это имеет какое-либо сходство со значениями простоя TCP (net.ipv4.tcp_keepalive_time, tcp_keepalive_probes и tcp_keepalive_interval из sysctl, если я правильно помню)? Не могу вспомнить, сохраняются ли изменения sysctl по умолчанию, но это может быть что-то, что было изменено и затем сброшено перезагрузкой.

Также вы можете сбросить JDBC-соединения, не отсекая весь сервер; конечно, может в WebLogic, который, как я понимаю, не сильно помогает, но я не знаком с эквивалентами Tomcat.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...