2010-02-19 14 views
11

Tengo una conexión JDBC MySQL en Java. Mi programa funciona bien para la ejecución simple de consulta.MySQLNonTransientConnectionException en el programa JDBC en tiempo de ejecución

Si corro el mismo programa durante más de 10 horas y ejecutar una consulta entonces recibirá el siguiente MySQL excepción:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: 
Connection.close() has already been called. Invalid operation in 
this state. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(
    Native Method) 
    com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: 
    No operations allowed after statement closed. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(
    Native Method) 

No he utilizado close() método en cualquier lugar. Creé una conexión de base de datos y la abrí para siempre y siempre ejecuté la consulta. No hay ningún lugar donde mencione explícitamente el tiempo de espera para la conexión. No puedo identificar el problema

Este es el código que utilizo para la conexión de base de datos:

String driver = PropertyReader.getDriver(); 
String url = dbURLPath; 
Class.forName(driver); 
connectToServerDB = DriverManager.getConnection(url); 
connectToServerDB.setAutoCommit(false); 

Lo que hace que una excepción?

Respuesta

5

Debe realizar un cambio en el archivo de configuración o aumentar el tiempo de espera de su base de datos. Si la base de datos permanece inactiva durante más de 8 horas, se cerrará de manera predeterminada.

Gracias

23

MySQL termina una conexión después de 8 horas de tiempo de espera. Puede modificar el tiempo de espera configurando la variable wait_timeout en MySQL.

Sin embargo, en general, no es una buena idea que una aplicación mantenga una conexión durante tanto tiempo. Un mejor enfoque es configurar un grupo de conexiones utilizando una API de agrupamiento como Apache DBCP y recuperar conexiones del grupo en lugar de directamente a través de un controlador. Un grupo de conexiones también se ocupará de restablecer una conexión agrupada si se muere por algún motivo, incluidos los tiempos de espera.

2

También tuve el mismo problema. Es debido al tiempo de espera de conexión de mysql y, en general, no es una buena práctica ampliar el tiempo de espera en mysql, ya que sirve para muchas otras aplicaciones. Es bueno volver a conectar la base de datos en los tiempos de espera (es decir, cuando se produce esta excepción) o utilizar algunas bibliotecas de código abierto para la agrupación de conexiones, como Apache DBCP, como se sugirió @slava. ORM Frameworks se encarga de esto por defecto. ¡¡Aclamaciones!!

Cuestiones relacionadas