2009-12-08 17 views
7

He configurado tomcat para usar un grupo de conexiones aún después de que el tiempo de espera de mysql en las conexiones las conexiones abiertas previamente en el grupo no se abren. Aquí se ve mi archivo context.xml:El grupo de conexiones JDBC no vuelve a abrir Conexiones en tomcat

<Resource name="jdbc/hpsgDB" auth="Container" type="javax.sql.DataSource" 
      maxActive="5" maxIdle="3" maxWait="10000" 
      username="uname" password="password" driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://localhost:3306/hpsgdb?autoReconnect=true"/> 

Como puedes ver he incluido autoReconnect como verdadero pero no es así. He verificado el proceso en la base de datos después de 8 horas, que es en lo que se establece el tiempo de espera. Si alguien puede ayudar, por favor ayúdenme, ya que esto ha sido un problema durante algunos meses, pero ha surgido como urgente debido a que mi software se lanzará pronto.
Gracias de antemano Dean Chester

Respuesta

6

trate de añadir un atributo de consulta de validación. Esto debería tener el efecto de cerrar y reabrir automáticamente la conexión después de un tiempo de espera como este:

validationQuery="SELECT 1" 
+0

También recibí esta solución en otro foro y ya lo he hecho. – Dean

+0

validationQuery no es suficiente. Lea: http://leakfromjavaheap.blogspot.com/2013/11/robust-db-connection-pool-configuration.html –

+0

las propiedades 'testWhileIdle' y' test-on-borrow' usarán validationQuery –

1

Puesto que esto es urgente y para la producción te sugiero que tienen vistazo a un pool de conexiones decente como c3p0. Es más robusto y confiable y puede manejar mejor los tiempos de espera.

5

Primero, deshazte de la propiedad autoReconnect. No necesita esto con un grupo de conexiones y puede causar problemas.

En segundo lugar, asegúrese de que cerca todos los recursos (Connection, Statement y ResultSet) en su código JDBC en el bloque finally.

No estoy seguro de si esto se aplica en su caso, pero un concepto erróneo común entre los principiantes es que parecen pensar que no es necesario que cierre esos recursos en caso de conexiones agrupadas. Esto no es cierto. Una conexión agrupada es una envoltura (decorador) alrededor de una conexión que tiene una close() método ligeramente modificado, que más o menos se parece a

public void close() throws SQLException { 
    if (this.connection is still active) { 
     do not close this.connection, but just return it to pool for reuse; 
    } else { 
     actually invoke this.connection.close(); 
    } 
} 

Con otras palabras, cerrándolos libera la conexión agrupada de modo que puede volver a poner en el grupo para su reutilización futura. Si adquiere conexiones sin cerrarlas, tarde o temprano, la agrupación se quedará sin conexiones.

0

Con su configuración, no debe crear otra conexión si está inactiva. Intente agregar

minIdle="3" 

Con esta configuración, DBCP mantendrá 3 conexiones todo el tiempo.

Vemos exactamente el mismo comportamiento con uno de los servidores poco utilizados. Debido al tiempo de espera de conexión predeterminado de 8 horas, no vemos conexiones cuando llegamos por la mañana. Eso es lo que esperábamos. Sin embargo, a veces vemos una conexión obsoleta y la primera solicitud fallará. Para solucionar este problema, es necesario añadir siguientes atributos,

testWhileIdle="true", 
timeBetweenEvictionRunsMillis="60000" 
Cuestiones relacionadas