2012-06-22 8 views
5

Tenemos una webapp corriendo Hibernate/C3PO 4.1.4.Final, Espolón, Java 6 y MySQL 5.1.63.MySQL/Hibernate tiene al azar "fallo del enlace de comunicaciones"

javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: enlace de comunicaciones fracaso

El último paquete recibido correctamente desde el servidor de hace 238,519 milisegundos. El último paquete enviado correctamente al servidor fue hace 0 milisegundos.

sección de propiedades de nuestra persistence.xml se parece a esto ...

<properties> 
     <property name="hibernate.show_sql" value="false"/> 
     <!--Begin Credentials --> 
     <property name="hibernate.connection.url" 
        value="${rp.config.db.url}&amp;useUnicode=true&amp;characterEncoding=UTF-8"/> 
     <property name="hibernate.connection.username" value="${rp.config.db.user}"/> 
     <property name="hibernate.connection.password" value="${rp.config.db.password}"/> 
     <!--End Credentials --> 
     <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
     <property name="hibernate.dialect" value="com.printlogix.rp.server.utils.Mysql5BitBooleanDialect"/> 
     <property name="hibernate.hbm2ddl.auto" value="validate"/> 
     <!--C3PO --> 
     <property name="hibernate.connection.provider_class" 
        value="org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider"/> 
     <property name="hibernate.c3p0.acquire_increment" value="25"/> 
     <property name="hibernate.c3p0.idle_test_period" value="60"/> 
     <property name="hibernate.c3p0.timeout" value="120"/> 
     <property name="hibernate.c3p0.max_size" value="150"/> 
     <property name="hibernate.c3p0.min_size" value="25"/> 
     <property name="hibernate.c3p0.max_statement" value="0"/> 
     <property name="hibernate.c3p0.preferredTestQuery" value="select 1;"/> 

    </properties> 

Nuestro tiempo de espera en MySQL se establece en 600 segundos. No tenemos idea de cómo está sucediendo esto 1/5 veces. El servidor tiene muy poca carga, la base de datos es relativamente pequeña, todos los servlets se ejecutan en segundos.

Alguien tiene alguna idea?

+0

¿Hay algún problema en la comunicación entre los equipos que alojan embarcadero y MySQL? ¿Algún tipo de firewall? –

+0

¿Cuáles son las transacciones que estás haciendo para causar un caso así? ¿Cuánto tiempo duran? Si duran más que el tiempo de espera de MySQL, intente dividir la transacción en varias transacciones por lotes. Fuentes: estado allí, hecho eso (si ese es el caso lo que describí :)) –

+0

¿Primero de todo es su funcionamiento mysql? y este parámetro apunta a la url correcta -rp.config.db.url? – Chan

Respuesta

0

También se han enfrentado el mismo problema en el servidor de producción. Por defecto, MySQL restablece las conexiones cada 8 horas y, por lo tanto, recibimos fallas de comunicación casi cada 8 horas porque estábamos accediendo continuamente a la base de datos con trabajos programados. Lo solucionamos aumentando 'wait_timeout' a 14 días y como nuestro mantenimiento está programado cada 15 días, reiniciamos cada uno de los servidores MySQL que son nuestro clúster de DB (tenemos la replicación de Master-Master en su lugar). Con el enfoque no tenemos ningún error en el enlace de comunicación después de eso. De hecho, en algún momento no reiniciamos el servidor cada 15 días, pero todavía no hay ningún error (toque de madera). :) Según su descripción, parece que ha configurado wait_timeout en 10 minutos, por lo que supongo que obtendrá los errores con una diferencia de tiempo de aproximadamente 10 minutos. Tenga en cuenta que no es necesario tener este error en cada restablecimiento de conexión MySQL después de wait_timeout. Estaría allí solo si está accediendo a la base de datos en ese momento. :)

0

creo this post podría ayudar. Si es el caso, aumentar el valor de wait_timeout solo pospone la ocurrencia más tiempo, en lugar de resolver el problema.

El problema podría estar relacionado con esto:

  • abrir una sesión de hibernación
  • hacer algunas cosas que toman más tiempo que el valor de wait_timeout de su base de datos
  • intenta utilizar este hibernación sesión. El mensaje que comenta aquí aparecerá

He documentado un caso en here si está interesado.