Esta pregunta se ha hecho un par de veces, y muchas veces en otros sitios. Pero yo no conste respuesta.

Mi problema:

Tengo una aplicación web java que utiliza simples JDBC para conectarse a mysql base de datos a través de Glassfish servidor de aplicaciones.

He utilizado la agrupación de conexiones en el servidor glassfish con las siguientes configuraciones:

Inicial Del Tamaño De La Piscina: 25

Máximo Tamaño De La Piscina: 100

Piscina Cambiar El Tamaño, Cantidad: 2

Tiempo de espera inactivo: 300 segundos

Max Tiempo de Espera: 60.000 milisegundos

Se ha implementado la aplicación de los últimos 3 meses y funcionaba a la perfección también.

Pero a partir de los 2 últimos días el siguiente error está llegando en el momento de inicio de sesión.

Parcial StackTrace

com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed due to underlying exception/error:  

** BEGIN NESTED EXCEPTION **  

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

** BEGIN NESTED EXCEPTION **  

java.io.EOFException  
MESSAGE: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.  

STACKTRACE:  

java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.  
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1997)  
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2411)  
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2916)  
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)  
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)  
at com.mysql.jdbc.Connection.execSQL(Connection.java:3256)  
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1313)  
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1448)  
............  
............  
my application traces....  

La causa de este error de repente ? He perdido un montón de tiempo para esto.

EDICIÓN : El problema aun persiste después de reiniciar el servidor. Según el DBA dos de los importantes mysql configuraciones de servidor son:

wait_timeout : 1800 segundos

connect_timeout : 10 segundos

NOTA : Otras aplicaciones desplegadas en el mismo servidor de la conexión a la misma base de datos y el uso de diferentes piscinas están funcionando sin problemas.

EDITAR-2 : Después de leer un montón de cosas y esperar resultados positivos hice estos cambios a mi grupo de conexión.

Max Tiempo de Espera : 0 (anteriormente era de 60 segundos)

Conexión De Validación : Requeridos

Método de validación : tabla

Nombre De La Tabla : Demo

Validar Atmost una Vez : 40 segundos

La Creación De Reintentos : 1

Intervalos de reintento : 5 segundos

Max Uso De La Conexión : 5

Y esto funcionó como se ejecuta la aplicación para 3 días de forma coherente. Pero tengo una muy extraño e interesante resultado de esto. Mientras que el control de la conexión de la piscina, me he encontrado con estas cifras:

NumConnAcquired : 44919 Contar

NumConnReleased : 44919 Contar

NumConnCreated : 9748 Contar

NumConnDestroyed : 9793 Contar

NumConnFailedValidation : 70 Contar

NumConnFree : 161 Contar

NumConnUsed : -136 Contar

Cómo puede el NumConnFree convertido 161 como he Maximum Pool Size = 100 ?

Cómo puede el NumConnUsed convertido en -136, un negativo número ?

Cómo puede el NumConnDestroyed > NumConnCreated ?

  • Trate de usar el mismo o menor tiempo de espera de los valores dentro de la aplicación y la base de datos. Por ejemplo, si las aplicaciones de tiempo de espera de inactividad es mayor que el de la base de datos de la aplicación va a tratar de reutilizar una conexión que ya fue cerrada por el servidor de base de datos.
  • Ayuda a aumentar la piscina cambiar el tamaño de la cantidad? Ver la razón por la aquí
InformationsquelleAutor mukund | 2012-12-19

6 Comentarios

  1. 9

    La conexión ha fallado, posiblemente debido a un firewall de idle-timeout, etc. Si usted no tiene el controlador JDBC configurado para volver a conectar en caso de error, este error no desaparece a menos que abrir una nueva conexión.

    Si usted está utilizando una conexión de base de datos libre (usted son el uso de uno, ¿verdad?), entonces usted probablemente desea habilitar la conexión de comprobación de características como la emisión de una consulta para comprobar si la conexión está funcionando antes de la entrega de nuevo a la aplicación. En Apache commons-dbcp, esto se llama el validationQuery y a menudo a algo tan simple como SELECT 1.

    Puesto que usted está utilizando MySQL, usted debe utilizar un Conector/J-específicas «ping» de la consulta que es de peso ligero de lo que en realidad la emisión de una verdadera consulta SQL y establecer su validación consulta a /* ping */SELECT 1 (el ping parte debe ser exacto).

    • El enlace «debe ser exacto» está roto. alguna idea de lo que la página original dijo?
    • Actualizado.
    • Y, porque es de Oracle, el enlace está roto, otra vez…
    • He arreglado el enlace, de nuevo. Para referencia en el futuro (cuando Oracle mueve, de nuevo), la referencia es a la de MySQL Connector/J versión 5.1.3 notas de la versión, cuyo último elemento que contiene la sintaxis a utilizar.
  2. 8

    Lo más probable es que la base de datos se ha reiniciado o la conexión de red a la base de datos se ha roto (por ejemplo, una conexión de NAT se ha agotado el tiempo) … y su webapp está tratando de usar una base de datos obsoleta de la conexión.

    Si el problema persiste después de reiniciar el contenedor web, podría ser algo más grave.


    Se le preguntó lo siguiente:

    How can the NumConnFree become 161 as I have Maximum Pool Size = 100 ?
    How can the NumConnUsed become -136, a negative number ?
    How can the NumConnDestroyed > NumConnCreated ? 

    En la cara de ella, estos no tienen sentido. Sin embargo, podría ser simplemente el resultado de algunos contadores de uso que se actualiza en un no-hilo-de una manera segura. Esto no es necesariamente relacionados con su problema original.

    • Véase mi Edición.Creo que algún problema de configuración puede estar allí.
  3. 6

    Este es EndOfFileException en java, que sucede cuando el cursor en el punto de inicio es el punto final o cuando la conexión de base de datos cerrada debido a algunos inesperados excepción.

    • Esta es una explicación genérica de la EOFException, pero realmente no ayuda con el JDBC problema que mukund está preguntando acerca de.
  4. 5

    Mientras que yo no tengo soluciones definitivas, parece que algo está interfiriendo la comunicación entre el servidor de aplicaciones y base de datos. Siguientes son algunas cosas que usted puede intentar aislar los problemas:

    • Tratar de determinar si este es mysql problema o código java problema. Intente conectarse a mysql usando la herramienta de línea de comandos desde el mismo host que el servidor de aplicaciones y problema similar SQL para realizar el inicio de sesión. Prueba utilizando un simple código java que hace un select, instalarla en la misma infraestructura, ver lo que sucede etc. También compruebe el registro del servidor mysql, vea si puede encontrar algo útil

    • Hay dos manera de inactividad de la conexión se cierra: por el grupo de conexión de código que se ejecuta dentro del servidor de aplicaciones, o por mysql en sí. Asegúrese de que usted compruebe la configuración en ambos lados

    • Comprobar si cualquier infraestructura de red de configuración ha cambiado recientemente. Hubo alguna nueva regla de firewall en lugar de interferir con la aplicación de servidor: <–> mysql conectividad? Hubo alguna configuración que prohíbe la conexión TCP al ralentí más de X?

    • Trate de una agrupación de conexión diferente de la biblioteca, sólo para eliminar la posibilidad de que la agrupación de conexiones

    Buena suerte

    • en mi caso, cuando se trata con este fue el valor de tiempo de espera es demasiado pequeño.
  5. 1

    He tenido este problema, pero yo no era posible para mí para hacer cambios en la configuración de base de datos MySQL. Por lo tanto puedo asegurar que en mi sql conector de clase de la conexión siempre se cierra antes de que se inicia de nuevo. Algo así como:

    public static Connection getConnection() {
    
        if (DatabaseConnnector.conn == null) {
            initConn();
        } else {
            try {
                DatabaseConnnector.conn.close();          
            } catch (SQLException e) {
                e.printStackTrace();
            }
              initConn();
        }
        return DatabaseConnnector.conn;
    }

    Y ya esta resuelto el problema.

Dejar respuesta

Please enter your comment!
Please enter your name here