2010-07-29 30 views
8

Después de reiniciar el servidor, la conexión oráculo del servidor Tomcat se agota todas las noches. Antes del reinicio, la conexión no se agotó. Ahora, en la mañana, la aplicación arroja un error de conexión JDBC al acceder al DB. Reiniciar Tomcat corrige el problema. Supongo que eso se debe a que las conexiones se restablecieron. Creo que esto se debe a que Oracle DB ha agotado el tiempo de la sesión. ¿Cómo se puede desactivar el tiempo de espera de la sesión en Oracle 11g?
Gracias!
SteveConfiguración del tiempo de espera de la sesión Oracle 11g

Config.groovy con dev y prueba omitida.

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

¿se trata de una aplicación de grails que se ejecuta en tomcat? –

+0

sí - Grails 1.2.2, RHEL 5.5, Tomcat 6.0.26 – ptsw

Respuesta

12

Eso generalmente se controla mediante el perfil asociado con el usuario al que se conecta 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 

De modo que el usuario con el que estoy conectado tiene tiempo de inactividad ilimitado, sin tiempo de espera.

+0

Adam, ¡Gracias por la sugerencia! Todo se ve en orden con el usuario, pero desafortunadamente la conexión se eliminó durante la noche. Argh! ¿Alguna otra idea? Obviamente no soy un tipo DBA, pero las cosas que me desconciertan es que esto no sucedió hasta que reinicié el servidor. Me pregunto si ejecuté un comando que permite que las conexiones permanezcan inactivas indefinidamente y que cuando el servidor se reinició se perdió la configuración. – ptsw

0

¿Sabe el DB que la conexión se ha caído, o la sesión todavía aparece en v $ session? Eso indicaría, creo, que la red lo descarta. ¿Sabes cuánto tiempo puede permanecer inactivo antes de encontrar el problema, y ​​si tiene algún parecido con los valores inactivos de TCP (net.ipv4.tcp_keepalive_time, tcp_keepalive_probes y tcp_keepalive_interval de sysctl si recuerdo correctamente)? No puedo recordar si los cambios de sysctl persisten por defecto, pero eso podría ser algo que se modificó y luego reiniciar mediante el reinicio.

También es posible que pueda restablecer sus conexiones JDBC sin rebotar todo el servidor; sin duda puede hacerlo en WebLogic, que me doy cuenta no ayuda mucho, pero no estoy familiarizado con los equivalentes de Tomcat.

+0

Alex, solo vi sesiones con LOGON_TIME> último reinicio de tomcat. Si la red estaba agotando la sesión, esas sesiones aún deberían estar en la tabla, independientemente del reinicio de tomcat. ¿Derecha? información sysctl: net.ipv4.tcp_keepalive_intvl = 75 = 9 net.ipv4.tcp_keepalive_probes net.ipv4.tcp_keepalive_time = 7200 – ptsw

+0

Sí, el reinicio Tomcat no afectaría a todas las sesiones huérfanas de edad. Supongo que Oracle podría notar que están muertos después de un tiempo y terminarlos, independientemente de que su cliente cierre su final (solo cuando intenta enviar datos); tenemos una aplicación cliente JDBC que se comporta así muchas horas después de que se rebotó la base de datos remota, pero estoy seguro de que hay muchas variaciones. Debería verificar qué hay en la sesión v $ inmediatamente después del tiempo de espera, pero como eso no se sabe y en algún momento de la noche a la mañana es difícil. Supongo que supervisa v $ session y ves cuando se cierran? Buena suerte ... –

2

Adam ya ha sugerido perfiles de bases de datos.

Puede consultar el archivo SQLNET.ORA. Hay un parámetro EXPIRE_TIME, pero esto es para detectar conexiones perdidas, en lugar de terminar las existentes.

Dado que pasa de la noche a la mañana, suena más como un tiempo de espera inactivo, que podría deberse a un cortafuegos entre el servidor de la aplicación y el servidor de la base de datos. Al configurar el EXPIRE_TIME puede dejar de suceder eso (ya que habrá un cheque cada 10 minutos para comprobar que el cliente está vivo).

O posiblemente la base de datos se cierre y se reinicie y eso está acabando con las conexiones.

Alternativamente, usted debe ser capaz de configurar Tomcat con un validationQuery para que se reiniciará automáticamente la conexión sin un gato reiniciará

+0

Gary, El archivo sqlnet.ora realmente no contiene mucho en mi sistema. Solo tiene dos variables definidas: NAMES.DIRECTORY_PATH y ADR_BASE. ¿Esto te parece correcto? - Steve – ptsw

+0

Suena normal. Sin un expire_time, Oracle generalmente no se dará cuenta si la conexión del cliente finaliza a menos que esté en el medio de algo. Si las entradas de v $ session no se quedan, parece que se cierran intencionalmente, ya sea la aplicación cliente. –

2

Esto es probablemente causado por la agrupación de conexiones de la aplicación; no es un problema de Oracle DBMS. La mayoría de los grupos de conexiones tienen una declaración de validación que se puede ejecutar antes de proporcionarle la conexión. En Oracle, querrías "Seleccionar 1 de doble".

La razón por la que comenzó a producirse después de reiniciar el servidor es porque probablemente el conjunto de conexiones se agregó sin reiniciar y ahora está experimentando el uso del grupo de conexiones por primera vez. ¿Cuáles son las fechas de modificación en sus archivos de recursos que se ocupan de las conexiones a la base de datos?

ejemplo Validar Pregunta:

<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: En el caso de Grails, hay opciones de configuración similares para la piscina griales. Ejemplo para Grails 1.2 (ver notas de la versión para Grails 1.2) ajustes

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

Brian, gracias por la sugerencia, pero mi aplicación usa los griales para la configuración de la base de datos. No creo que los archivos de configuración de Tomcat jueguen un rol. ¿Derecha? - Steve – ptsw

+0

¿Se ha establecido como conjunto verdadero o falso en la configuración de la base de datos de Grails? El valor predeterminado es verdadero, si no tiene el conjunto de parámetros. Si el conjunto se establece en verdadero, apostaría que el problema es el conjunto, no las sesiones de Oracle. –

0

Comprobar conexión de aplicaciones de piscina, en vez de alterar las opciones de sesión timout en la db oráculo. Es normal que se excedan.

un vistazo aquí: http://grails.org/doc/1.0.x/guide/3.%20Configuration.html#3.3%20The%20DataSource

¿Seguro de que ha establecido el parámetro "combinado" correctamente?

saludos, Lars


EDIT:
Su configuración parece bien el primer vistazo. Me encontré con este problema hoy. Tal vez está relacionada con su dolor:
"Infinite loop of exceptions if the application is started when the database is down for maintenance"

+0

Lars, gracias por la sugerencia. Agregué mi Config.groovy a la pregunta. Todo se ve bien para mí. ¿Te sale algo malo? - Steve – ptsw

1

llegué a esta pregunta en busca de una manera de permitir la piscina de caducidad sesión de Oracle basado en la vida total de la sesión en lugar de tiempo de inactividad. Otro objetivo es evitar el cierre forzado inesperado de la aplicación.

Parece que es posible mediante el establecimiento de la piscina validation query a

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

Esto sería cerrar las sesiones de envejecimiento de más de 30 minutos en el modo predecible que no afecta a la aplicación.

+0

Y aquí hay una consulta de validación similar para JBoss AS: http://stackoverflow.com/a/32844258/603516 – Vadzim

Cuestiones relacionadas