2009-03-20 25 views
30

Estoy usando JDBC para conectarme a un servidor MySQL (no creo que haya una combinación de conexiones). En la conexión URL tengo autoReconnect=true¿Por qué autoReconnect = true no parece funcionar?

Pero mi conexión aún se agota. Incluso he comprobado conn.isClosed() y es falso. Pero cuando trato de usar la conexión obtengo la siguiente excepción.

 
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION ** 

java.net.SocketException 
MESSAGE: Software caused connection abort: socket write error 

STACKTRACE: 

java.net.SocketException: Software caused connection abort: socket write error 
... 

sé en Java 1.6 se puede utilizar conn.isValid(0) para comprobar la conexión, pero yo estoy usando Java 1.5

¿Hay una manera de asegurarse de que sea tiempo de espera no? ¿O tendré que actualizar a Java 1.6?

Respuesta

30

Tuve el mismo problema y fue enloquecedor. Esto es lo que dicen los documentos en el sitio web de MySQL (énfasis mío)

¿Debería el controlador intentar restablecer conexiones obsoletas y/o muertas? Si está habilitado, el controlador lanzará una excepción para las consultas emitidas en una conexión obsoleta o muerta, que pertenecen a la transacción actual, pero intentará volver a conectarse antes de la siguiente consulta emitida en la conexión en una nueva transacción. No se recomienda el uso de esta función, ya que tiene efectos secundarios relacionados con el estado de la sesión y la coherencia de los datos cuando las aplicaciones no manejan SQLExceptions correctamente, y solo está diseñado para ser utilizado cuando no se puede configurar su aplicación para manejar SQLExcepciones resultantes de muertes y conexiones obsoletas apropiadamente. Alternativamente, investigue la configuración de la variable del servidor MySQL "wait_timeout" a un valor alto en lugar del valor predeterminado de 8 horas.

En mi experiencia, no parece que funcionara la funcionalidad "reconectar en la próxima consulta", pero estaba usando MySQL 4.0, que puede haber sido la razón para eso.

Terminé escribiendo un mini-framework que capta las excepciones, busca ese error específico e intenta reconectar y reintentar la consulta si es posible.

ETA: This link proporciona un poco más de información e indica que autoReconnect probablemente se elimine en el futuro de todos modos.

+3

El consejo de no utilizar autoReconnect porque se eliminará en el futuro es de 8-10 años. Y, sin embargo, sigo viendo que MySQL 5.x proporciona una guía que establece que la propiedad Connector/J autoReconnect es una opción para resolver este problema ... –

+2

Del documento vinculado: "No hay una forma 100% segura de que un controlador JDBC pueda reconectarse automáticamente si una conexión TCP/IP muere sin riesgo de corrupción del 'estado' de la base de datos (incluso _con semántica transaccional), que es la razón por la cual esta característica eventualmente será eliminada. " –

2

autoReconnect todavía arroja la excepción para que pueda elegir hacer algo al respecto si lo desea. Si lo atrapa, debería encontrar que la conexión está allí nuevamente después. (Hay algo más de complejidad si estás en una transacción: tu transacción actual está prácticamente muerta.)

Cuestiones relacionadas