Tengo un Java webapp usando Hibernate y MySQL. Si el sitio no utilizado para un par de días, la conexión de MySQL se envejece, y estoy reunió con la siguiente excepción:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Connection.close() has already been called. Invalid operation in this state.

De experiencia en el uso de raw JDBC es posible configurar la conexión para intentar recuperarse de los errores u obsoletos conexiones, pero no sé cómo hacerlo usando Hibernate. Yo no soy explícitamente llamar a close() en cualquier lugar (pero estoy apostando Hibernate hace en algún lugar en lo profundo de sus entrañas).

¿ Alguien sabe lo que debo hacer?

  • Hizo usted trate de usar isValid para la conexión para comprobar si la conexión es válida y si no, a continuación, vuelva a conectar. Creo que esto debería resolver el problema sin tener que modificar la configuración del servidor
InformationsquelleAutor Gabe Johnson | 2009-04-06

5 Comentarios

  1. 3

    He tenido ese problema. Mediante la agrupación de conexiones (c3p0) la hizo desaparecer. También es una buena idea, en general, el uso de algunos de agrupación de conexiones.

  2. 2

    Gracias por el consejo. Para la posteridad bien, he cambiado el hibernate.cfg.xml de las siguientes opciones:

    <property name="connection.url">jdbc:mysql://localhost/FooDB</property>
    <property name="connection.username">root</property>
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="connection.password">secret</property>
    <property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>

    … a la siguiente:

    <property name="connection.datasource">java:/comp/env/jdbc/FooDB</property> 
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

    Esto también requiere la adición de un estándar de ‘contexto’ entrada en mi web de la aplicación context.xml:

    <Resource name="jdbc/FooDB"
              auth="Container"
              type="javax.sql.DataSource"
              maxActive="100"
              maxIdle="30"
              maxWait="10000"
              username="root"
              password="secret"
              driverClassName="com.mysql.jdbc.Driver"
              url="jdbc:mysql://localhost:3306/ss?autoReconnect=true" />

  3. 1

    Hemos tenido un problema similar de hibernación de conexión de mysql para llegar agotado.
    Lo que hemos tratado de C3P0, con la siguiente configuración:

    <property name=c3p0.acquire_increment>1</property>
    <property name=c3p0.idle_test_period>3600</property> 
    <property name=c3p0.max_statements>0</property> 
    <property name=c3p0.min_size>1</property> 
    <property name=c3p0.timeout>3605</property> 
    <property name=hibernate.c3p0.preferredTestQuery>select 1;</property>

    Hibernate connection_pool tamaño se establece en 1.

    Esto hizo que el tiempo de espera de problema desaparece. Pero empezamos enfrenta a otro problema. Mucho tiempo de espera.
    Tenemos un servicio (servlet se ejecuta en jboss), que recibe algo así como 5-6 solicitudes por segundo. Cada solicitud que se necesita para conectarse a mysql a través de hibernate. La mayoría de nuestras peticiones hacer selecciona, con una inserción/actualización cada 5-6 de la solicitud. Normalmente la solicitud en el tiempo para nosotros es de 2-3ms para seleccionar y 40-50ms para insertar o actualizar. Pero, después de usar el anterior C3P0 de configuración, vimos que cada solicitud de completar después de una actualización estaba tomando casi 4-5 minutos! A partir de nuestros registros, parecía que aleatoriamente seleccione una solicitud se atasque y será capaz de completar sólo después de una solicitud de actualización se recibió y se sirve.

    Por encima de problema desaparece si se elimina el C3P0 config. Puede alguien sugerir lo que podría estar haciendo mal?

    Aquí está la completa hibernate config para referencia:

    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE hibernate-configuration PUBLIC
              "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
              "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        <session-factory>
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="connection.url">jdbc:mysql://xxx.xxx.xxx</property>
            <property name="connection.username">xxx</property>
            <property name="connection.password">xxx</property>
            <property name="connection.pool_size">1</property>
            <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
            <property name="current_session_context_class">thread</property>
            <property name="hibernate.cache.use_query_cache">false</property>
            <property name="hibernate.cache.use_second_level_cache">false</property>
            <property name="show_sql">true</property>
            <!-- Transaction isolation 2 = READ_COMMITTED -->
            <property name="connection.isolation">2</property>
            <property name="connection.autocommit">true</property>
            <!-- configuration pool via c3p0-->
            <property name="c3p0.acquire_increment">1</property>
            <property name="c3p0.idle_test_period">3600</property> <!-- seconds -->
            <property name="c3p0.max_size">1</property>
            <property name="c3p0.max_statements">0</property>
            <property name="c3p0.min_size">1</property>
            <property name="c3p0.timeout">3605</property> <!-- seconds -->
            <property name="hibernate.c3p0.preferredTestQuery">select 1;</property>
        </session-factory>
    </hibernate-configuration>
  4. 1
    <property name="c3p0.acquire_increment">1</property> 
    <property name="c3p0.idle_test_period">120</property> <!-- seconds --> 
    <property name="c3p0.max_size">100</property> 
    <property name="c3p0.max_statements">0</property> 
    <property name="c3p0.min_size">10</property> 
    <property name="c3p0.timeout">180</property> <!-- seconds --> 

    reemplazar estos valores en el archivo de configuración. Se ll ayuda para usted.

Dejar respuesta

Please enter your comment!
Please enter your name here