not max_idle_time for example dependency built hibernate c3p0

hibernate - max_idle_time - ¿Cuáles son los ajustes requeridos de C3P0 para hibernación a fin de evitar interbloqueos?



java c3p0 timeout (6)

Uso Hibernate junto con MySQL 5.1.30.

Tengo las siguientes bibliotecas:

  • c3p0-0.0.1.2.jar
  • mysql-connector-java-5.0.3-bin.jar
  • hibernate3.jar

Utilizo un hibernate.cfg.xml para la configuración:

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="connection.driver_class">org.gjt.mm.mysql.Driver</property> <property name="connection.url">jdbc:mysql://localhost/fooDatatbase</property> <property name="connection.username">foo</property> <property name="connection.password">foo123</property> <!-- Use the C3P0 connection pool provider --> <property name="hibernate.c3p0.min_size">5</property> <property name="hibernate.c3p0.max_size">20</property> <property name="hibernate.c3p0.timeout">300</property> <property name="hibernate.c3p0.max_statements">50</property> <property name="hibernate.c3p0.idle_test_periods">3000</property> <!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- Enable Hibernate''s automatic session context management --> <property name="current_session_context_class">thread</property> <!-- Disable the second-level cache --> <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> <!-- Echo all executed SQL to stdout --> <property name="show_sql">true</property> <mapping resource="databaselayer/mail/Mail.hbm.xml"/> <mapping resource="databaselayer/courses/Course.hbm.xml"/> <mapping resource="databaselayer/price/Price.hbm.xml"/> <mapping resource="databaselayer/contact/Contact.hbm.xml"/> <mapping resource="databaselayer/artists/Musician.hbm.xml"/> <mapping resource="databaselayer/concerts/Concert.hbm.xml"/> <mapping resource="databaselayer/welcome/Welcome.hbm.xml"/> <mapping resource="databaselayer/information/Information.hbm.xml"/> </session-factory> </hibernate-configuration>

En la persistencia de JAVA con el libro de hibernación , se explican las opciones de configuración de c3p0:

  • hibernate.c3p0.min_size Este es el número mínimo de conexiones JDBC que C3P0 mantiene listas en todo momento
  • hibernate.c3p0.max_size Esta es la cantidad máxima de conexiones en el grupo. Se arroja una excepción en el tiempo de ejecución si este número se agota.
  • hibernate.c3p0.timeout Especifica el período de tiempo de espera (en este caso, 300 segundos) después de lo cual se elimina una conexión inactiva del grupo).
  • hibernate.c3p0.max_statements Número máximo de declaraciones que se almacenarán en caché. El almacenamiento en caché de declaraciones preparadas es esencial para un mejor rendimiento con Hibernate.
  • hibernate.c3p0.idle_test_periods Este es el tiempo de inactividad en segundos antes de que una conexión se valide automáticamente.

Uso Java 1.5.0_09 y tomcat 6.0 . Tengo tres aplicaciones implementadas en Tomcat. Cada uno de ellos usa hibernación con un archivo de configuración casi equivalente al que se muestra arriba (solo cambian el nombre de usuario, el nombre de base de datos, la contraseña y las resoluciones de mapeo).

Desafortunadamente con la configuración anterior, después de algunas horas corriendo obtengo algunos desagradables errores de interbloqueo que terminan matando a Tomcat.

Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@2437d -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1dc5cb7 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@9cd2ef -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@4af355 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1275fcb -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! Jan 22, 2009 3:29:35 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run

Esto parece ser un error que muchas personas ya obtuvieron. Cambié mi configuración tratando de seguir la solución descrita aquí http://forum.hibernate.org/viewtopic.php?p=2386237 para:

<property name="hibernate.c3p0.acquire_increment">1</property> <property name="hibernate.c3p0.min_size">0</property> <property name="hibernate.c3p0.max_size">48</property> <property name="hibernate.c3p0.timeout">0</property> <property name="hibernate.c3p0.max_statements">0</property>

Con la nueva configuración, no obtengo los Bloqueos, pero obtengo:

WARNING: SQL Error: 0, SQLState: 08S01 Jan 24, 2009 5:53:37 AM org.hibernate.util.JDBCExceptionReporter logExceptions SEVERE: Communications link failure due to underlying exception: ** BEGIN NESTED EXCEPTION ** java.io.EOFException STACKTRACE: java.io.EOFException at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1913)

¿Alguien sabe lo que estoy haciendo mal y cómo puedo configurar c3p0 correctamente?


¿Las tres aplicaciones comparten el mismo grupo de conexiones, o cada una obtiene las suyas? Yo recomendaría este último.


En realidad, es probable que ya sea demasiado tarde, pero el problema es bastante simple: hibernate.c3p0.idle_test_periods no debe ser más alto que hibernate.c3p0.timeout o las conexiones cerradas por la base de datos no se detectarán correctamente.

Además, las advertencias de detección de punto muerto parecen que alguna parte de su código no devuelve correctamente las conexiones al grupo (es decir, session.close ())

Las excepciones de MysqlIO ocurren cuando la aplicación está inactiva y MySQL cierra la conexión en el servidor. Ahora bien, si C3P0 no verifica correctamente si una conexión todavía está realmente conectada, obtienes las EOFExcepciones.

Espero que esto pueda ser útil.


Esa es una versión bastante antigua de Connector / J. Para asegurarte de que no estás luchando contra un error conocido y solucionado, comenzaría por obtener el más nuevo (5.0.8):

http://dev.mysql.com/downloads/connector/j/5.0.html

Esa EOFException de MysqlIO es un poco sospechosa. En el uso normal / sin errores, nunca deberías obtener errores de esa capa.


Los hibernate.c3p0.idle_test_periods tienen que ser menores que h * ibernate.c3p0.timeout * porque el primero es solo un valor de tiempo donde hibernate comprueba conexiones inactivas e intenta cerrarlo.

Mientras tanto, el segundo es cuánto tiempo se debe expulsar una conexión.

Si idle_test_periods es más grande que el parámetro de tiempo de espera que hibernación, busque cualquier cosa que sea nula o no exista en el sistema. Al menos lo entendí de esta manera.


No hay una respuesta definitiva a esta pregunta, ya que cambia de una aplicación a otra según el patrón de uso y carga.

El primer punto es referirse al enlace https://www.hibernate.org/214.html , ya que parece que lo has hecho y seguido. Aquí hay algunos consejos;

  • numHelperThreads: hilos auxiliares que no contienen bloqueos contenidos. Difundir estas operaciones en múltiples hilos
  • maxStatements: el tamaño del caché global PreparedStatement de c3p0.
  • maxStatementsPerConnection: el número de PreparedStatements c3p0 guardará en la memoria caché una única conexión agrupada.
  • maxAdministrativeTaskTime: Parámetro que fuerza una llamada al método de interrupción de la tarea () si una tarea excede un límite de tiempo establecido

Los primeros tres parámetros pueden mejorar o reducir el rendimiento en función del valor establecido, donde el cuarto parámetro puede interrumpir el hilo después de establecer el límite y dar un cambio para ejecutarlo a otro hilo.

Valores aproximados

  • numHelperThreads = 6
  • maxStatements = 100
  • maxStatementsPerConnection = 12
  • maxAdministrativeTaskTime = necesita tiempo suficiente para que la consulta pesada pueda ejecutarse en producción

maxStatements y maxStatementsPerConnection deben probarse durante algunos meses, ya que pocos puntos de publicación se bloquean debido a estos parámetros.

También hacer referencia a estos enlaces será útil;


<property name="hibernate.c3p0.timeout">300</property> <property name="hibernate.c3p0.idle_test_periods">3000</property>

El valor de idle_test_period debe ser menor que el valor de time out.