2010-07-29 3 views
8

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

Config.groovy с dev и тестом опущен.

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" 
    } 
} } 
+1

Это приложение grails работает на tomcat? –

+0

Да - Grails 1.2.2, RHEL 5.5, Tomcat 6.0.26 – ptsw

ответ

12

Это правило контролируется профилем, ассоциированным с пользователем 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 

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

+0

Adam, Спасибо за предложение! Все выглядит в порядке с пользователем, но, к сожалению, связь была сброшена за ночь. Argh! Любые другие идеи? Очевидно, я не чувак DBA, но все, что меня озадачило, это не произошло, пока я не перезагрузил сервер. Мне интересно, выполнила ли я команду, позволяющую соединениям оставаться на неопределенное время, что не было сохранено, и когда сервер перезагрузился, настройка была потеряна. – ptsw

0

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

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

+0

Alex, я только видел сеансы с LOGON_TIME> последний перезапуск tomcat. Если сеть отключила сеанс, эти сеансы все равно должны находиться в таблице, независимо от перезапуска tomcat. Правильно? Sysctl информация: net.ipv4.tcp_keepalive_intvl = 75 net.ipv4.tcp_keepalive_probes = 9 net.ipv4.tcp_keepalive_time = 7200 – ptsw

+0

Да, перезапуск Tomcat не будет затрагивать какие-либо старые сеансы бесхозными. Думаю, Oracle может заметить, что через некоторое время они мертвы и прекращают их, полностью независимо от того, что ваш клиент закрывает свой конец (только при попытке отправить данные через); у нас есть клиентское приложение JDBC, которое ведет себя так же много часов после того, как удаленная БД была отскока, но я уверен, что существует много вариантов. Вам нужно будет проверить, что находится в v $ сессии сразу после таймаута, но поскольку это неизвестно и когда-то в одночасье, это тяжело. Я думаю, монитор v $ сессии и посмотреть, когда они закрываются? Удачи ... –

2

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

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

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

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

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

+0

Gary, файл sqlnet.ora на самом деле не содержит многого в моей системе. Он содержит только две переменные - NAMES.DIRECTORY_PATH и ADR_BASE. Это кажется вам правильным? - Steve – ptsw

+0

Звучит нормально. Без expire_time Oracle, как правило, не заметит, завершено ли соединение клиента, если оно не находится в середине чего-то. Если записи сеанса v $ не висят вокруг, это звучит так, будто они намеренно закрыты как клиентское приложение. –

2

Это, вероятно, вызвано пулом соединений вашего приложения; а не проблема СУБД Oracle. В большинстве пулов подключений есть инструкция validate, которая может выполняться до предоставления вам соединения. В оракуле вам нужно «Выбрать 1 из двойника».

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

Validate Запрос Пример:

<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"/> 

EDIT: В случае 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  
    } 
} 
+0

Брайан, спасибо за предложение, но мое приложение использует grails для настройки базы данных. Я не думаю, что файлы конфигурации tomcat играют определенную роль. Правильно? - Steve – ptsw

+0

Скомпилировано ли значение true или false в вашей конфигурации базы данных grails? Значение по умолчанию - true, если у вас нет набора параметров. Если для пула установлено значение true, я бы поспорил, что это пул, а не сеансы Oracle. –

0

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

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

Вы уверены, что вы установили «объедин ли» параметр правильно?

Привет, Lars


EDIT:
Ваша конфигурация кажется нормально на первый взгляд. Сегодня я столкнулся с этим вопросом. Может быть, это связано с вашей болью:
"Infinite loop of exceptions if the application is started when the database is down for maintenance"

+0

Ларс, спасибо за предложение. Я добавил свой Config.groovy к вопросу. Все выглядит для меня. Что-то неправильно выпрыгивает на вас? - Steve – ptsw

1

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

кажется, что это возможно, установив бассейн validation query в

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

Это закрыть сеансы старения более 30 минут в предсказуемым образом, что не влияет на применение.

+0

И вот аналогичный запрос проверки для JBoss AS: http://stackoverflow.com/a/32844258/603516 – Vadzim

Смежные вопросы