2012-07-02 34 views
13

Tengo una aplicación web con un back-end Java que usa Tomcat jdbc-pool para las conexiones a la base de datos. Esto funciona bienintento de volver a conectar el origen de datos jdbc pool después de reiniciar la base de datos

Sin embargo, estoy tratando de engañar antes de exportarlo a otras ubicaciones, y recientemente se produjo un escenario donde alguien reinició el servicio de base de datos de SQL Server pero no reinició el servicio Tomcat. Esto provocó una SQLException: java.sql.SQLException: I/O Error: Connection reset by peer: socket write error hasta que reinicié Tomcat, lo que obligó a la fuente de datos jdbc-pool a reconectarse.

Busqué algún tipo de configuración en los documentos jdbc-pool de Tomcat para decirle a la fuente de datos que intente reconectar pero no pude encontrar nada.

¿Alguien sabe si hay algún tipo de configuración para esto o debería verificar esta condición antes de cada solicitud?

Respuesta

15

No 100% seguro si este es su problema pero en http://www.tomcatexpert.com/blog/2010/04/01/configuring-jdbc-pool-high-concurrency dice que puede usar testOnBorrow con validationQuery.

<Resource type="javax.sql.DataSource" 
      ... 
      testOnBorrow="true" 
      validationQuery="SELECT 1" 
      removeAbandoned="true" 
      /> 
+3

yo estaba tratando de evitar la consulta por encima de validación, y encontramos otro método en el que el mismo enlace usando 'timeBetweenEvictionRunsMillis = "5000"' y 'minEvictableIdleTimeMillis = "5000"' y 'minidle = "0" 'que parece manejar el problema, gracias. – Geronimo

0

Mientras revisaba el mismo problema, me encontré con esta publicación que tiene las configuraciones de conexión automática para todos los servidores de aplicaciones.

A continuación se muestra la configuración que utilicé para la conexión automática en tomcat como referencia.

<Resource auth="Container" 
driverClassName="oracle.jdbc.OracleDriver" 
initialSize="5" 
maxActive="120" 
maxIdle="5" 
maxWait="5000" 
name="jdbc/oracle/myds" 
password="secret" 
poolPreparedStatements="true" 
type="javax.sql.DataSource" 
url="jdbc:oracle:thin:@DBHOSTNAME:1521/ServiceName" 
username="testuser" 
validationQuery="select 1 from tab" 
testOnBorrow="true"/> 

autocompletar conectar configuraciones para todos los servidores de aplicaciones se puede encontrar aquí en Datasource autoreconnect in Java Application Servers.

0

Sólo para añadir a la respuesta de Natan Cox

Referencia - http://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html#Common_Attributes

<Resource type="javax.sql.DataSource" 
     ... 
     testOnBorrow="true" 
     validationQuery="SELECT 1" 
     removeAbandoned="true" 
     /> 

Como contra Gerónimo, todavía me gustaría utilizar validationQuery

base de datos validationQuery señala

hsqldb - select 1 from INFORMATION_SCHEMA.SYSTEM_USERS

Oracle - select 1 from dual

DB2 - select 1 from sysibm.sysdummy1

MySQL - select 1

Microsoft SQL Server - select 1

PostgreSQL - select 1

ingres - select 1

derby - values 1

H2 - select 1

Firebird - select 1 from rdb$database

Referencia - DBCP - validationQuery for different Databases

Cuestiones relacionadas