example create conexiones java mysql tomcat connection-pooling

java - create - tomcat jdbc connection pool example



WebApp(Tomcat-jdbc) Excepción de abandono de lanzamiento de conexión de base de datos agrupada (7)

¿Has visto la información en el sitio web de Tomcat relacionada con PoolConnection ? Quizás lo que necesitas es mirar la propiedad minEvictableIdleTimeMillis

Para responder a su pregunta, se está agotando el tiempo porque está comprobando las conexiones inactivas y abandonadas cada 30 segundos (consulte TimeBetweenEvictionRunsMillis ) y dado que está configurando un tiempo de espera desocupado desechable a los 30 segundos (consulte minEvictableIdleTimeMillis ), entonces termina con lo que tiene. Usted ha dicho que está recibiendo esta excepción mientras está inactivo, sospecho que la excepción es el resultado de cerrar la conexión inactiva en lugar de abandonar una conexión. Por lo que yo entiendo, abandonar una conexión se usa para exceder el tiempo de espera de las consultas (en lugar de las conexiones inactivas).

Personalmente, no me gustaría tener conexiones vivas para siempre porque estarían consumiendo recursos (es decir, una conexión a la base de datos) innecesariamente. Me gustaría jugar con mis conexiones máximas, ejecuciones de desalojo y tiempos de inactividad para optimizar mis propios requisitos. ¡Supongo que puedes establecer estos valores lo suficientemente grandes como para ser casi para siempre! Aunque realmente depende de lo que estés haciendo ...

Lo siento, no podría ser de mucha ayuda aquí.

He estado navegando SO durante algún tiempo y masticando mi sombrero en el proceso, pero no puedo encontrar una coincidencia exacta con mi problema.
En resumen, estoy obteniendo un excelente seguimiento de pila (org.apache.tomcat.jdbc.pool.ConnectionPool) después de 60 segundos de inactividad, que es un comportamiento normal para un par de subprocesos del lado del servidor.
Estoy usando la agrupación de conexiones JDBC de Tomcat (org.apache.tomcat.jdbc.pool.DataSource) directamente
Traza de la pila:

Oct 29, 2012 8:55:50 PM org.apache.tomcat.jdbc.pool.ConnectionPool abandon WARNING: Connection has been abandoned PooledConnection[com.mysql.jdbc.JDBC4Connection@1ad2916]:java.lang.Exception at org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:967) at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:721) at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:579) at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:174) at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:111) at com.getsom.getConnection(DAO.java:1444) at com.getsom.PreparedConnection.(PreparedConnection.java:48) at com.getsom.Alarms.run(Alarms.java:492)

Mis PoolProperties se configuran de la siguiente manera:

PoolProperties pp = new PoolProperties(); pp.setUrl( someValidUrl); pp.setDriverClassName("com.mysql.jdbc.Driver"); pp.setUsername( someUser); pp.setPassword( somePassword); pp.setJmxEnabled( true); pp.setTestWhileIdle( true); pp.setTestOnBorrow( true); pp.setValidationQuery( "SELECT 1"); pp.setTestOnReturn( false); pp.setValidationInterval(30000); pp.setTimeBetweenEvictionRunsMillis(30000); pp.setMaxActive(100); pp.setInitialSize(10); pp.setMaxWait(10000); pp.setMinEvictableIdleTimeMillis(30000); pp.setMinIdle(10); pp.setLogAbandoned(true); pp.setRemoveAbandoned(true); pp.setRemoveAbandonedTimeout(60); pp.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+ "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"); setPoolProperties(pp);

Esperaba que setValidationInterval (30000) me salvara, ya que 30s no es mucho en el ciclo de vida de una conexión. De todos modos la pregunta es:
¿Qué me falta para mantener viva esta conexión para siempre?
Es bueno saberlo: ¿Por qué me estoy agotando el tiempo en la función que reclamó la conexión, aunque se invocó 30 segundos antes?


A pesar de que tengo más de un año de retraso en esta página, sin embargo, tropecé aquí porque tenía problemas similares y también necesitaba una solución. Así que pensé en compartir lo que eventualmente me funcionó.

En mi caso, después de encontrar y leer este artículo >>> configuring-jdbc-pool-high-concurrency - acabo de agregar un interceptor como este a la configuración de mi grupo;

"org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer"

de modo que la línea (de su código publicado arriba) donde hace setJdbcInterceptors(...) ahora debe verse como la siguiente;

p.setJdbcInterceptors( "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;" + "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;" + "org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer");

Explicación - Citando del artículo, dice;

Queremos asegurarnos de que cuando detectamos que la conexión aún se está utilizando, restablecemos el temporizador de tiempo de espera, para que la conexión no se considere abandonada. Hacemos esto insertando un interceptor.

Cada vez que se prepara una declaración o se ejecuta una consulta, el temporizador restablecerá el temporizador de abandono en el conjunto de conexiones. De esta manera ... haciendo muchas consultas y actualizaciones, no se agotará el tiempo de espera.

Teniendo en cuenta que lo más probable es que hayas superado el problema hace mucho tiempo, todavía espero que esto ayude a alguien más a tener problemas similares que se topan con esta página, al igual que yo.

¡Aclamaciones!


Las respuestas a esta pregunta me fueron muy útiles.

Aunque en mi caso, ya tenía configurado el Interceptor JDBC "ResetAbandonedTimer".

Sin embargo, tuve una consulta que duró más que el "removeAbandonedTimeout" que también había configurado. Una vez que aumenté el "removeAbandonedTimeout", el problema desapareció.


Si define su fuente de datos en el context.xml de tomcat, debe agregar el ResetAbandonedTimer como se muestra a continuación:

jdbcInterceptors="ConnectionState;StatementFinalizer;ResetAbandonedTimer"

Después de configurar ResetAbandonedTimer, el problema se resolvió en mi aplicación. Le pedí que me avisara si hay alguna relación entre el interceptor ResetAbandonedTimer y removeAbandoned = "true" removeAbandonedTimeout = "60"


Simplemente agregue la siguiente entrada en tomcat7 conf / server.xml o en context.xml donde esté presente su etiqueta de recurso.

jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState; org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer; org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer"


Tenía un problema similar, es decir, Tomcat estaba cerrando la conexión JDBC debido a que se abandonó debido a que la transacción se estaba demorando mucho.

Se resolvió al darse cuenta de que abandoned e idle son diferentes y configurando: spring.datasource.tomcat.removeAbandonedTimeout: 86400 #seconds


siga ''removeAbandonedTimeout'' en el archivo de configuración. esto debería ser la consulta de ejecución máxima en la aplicación. De lo contrario se cerrará la conexión en medio de la ejecución.