No operations allowed after connection closed

31,129

This Java method called executeQuery:

your_database_connection.createStatement().executeQuery(your_string_query);

will throw this Exception:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: 
No operations allowed after connection closed.

if you try to run it (executeQuery) after calling:

your_database_connection.close()

What is happening

Either you are trying to get a connection to the database and are not getting one, and are trying to run a query against it which fails. Or you got a connection which suffered some problem and became closed, and you tried to run another query through it.

The solution

Assuming you lost the connection from network problems or something that isn't your fault, then put the code that attempts the query in a try/catch block, and on error wait 10 seconds and reconnect to the database.

Share:
31,129

Related videos on Youtube

tuxx
Author by

tuxx

Updated on March 04, 2020

Comments

  • tuxx
    tuxx about 4 years

    I'm getting this error from a Java application:

    com.mchange.v2.c3p0.impl.NewPooledConnection - [c3p0] Another 
    error has occurred [     
    com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: 
    No operations allowed after connection closed. ] which will not be 
    reported to listeners!
    

    The Java code:

    try {
        sessionFactory.beginTransaction();
        //...
        sessionFactory.commitTransaction();
    } catch (Exception e) {
        sessionFactory.rollbackTransaction();
        throw new RuntimeException(e);
    }
    

    The session factory:

    try {
        sessionFactory.beginTransaction();
        ...
        sessionFactory.commitTransaction();
    } catch (Exception e) {
        sessionFactory.rollbackTransaction();
        throw new RuntimeException(e);
    }
    
    public Transaction beginTransaction() throws HibernateException {
        try {
            return sessionFactory.getCurrentSession().beginTransaction();
        } catch (HibernateException hex) {
            LOG.error(String.format("Unable to start database transaction due to exception: %s.", ExceptionUtils.getRootCauseMessage(hex)));
            throw hex;
        }
    }
    
    public void commitTransaction() throws HibernateException {
        LOG.debug("Committing database transaction.");
        try {
            if (sessionFactory.getCurrentSession().getTransaction().isActive()) {
                sessionFactory.getCurrentSession().getTransaction().commit();
            } else {
                throw new HibernateException("Transaction is no longer Active.");
            }
        } catch (HibernateException hex) {
            LOG.error(String.format("Unable to commit due to exception: %s.", ExceptionUtils.getRootCauseMessage(hex)));
            throw hex;
        }
    }
    
    public void rollbackTransaction() throws HibernateException {
        LOG.debug("Trying to rollback database transaction after exception.");
        Session session = sessionFactory.getCurrentSession();
        try {
            if (session.getTransaction().isActive()) {
                session.getTransaction().rollback();
            } else {
                throw new HibernateException("Transaction is no longer Active.");
            }
        } catch (HibernateException hex) {
            LOG.error(String.format("Unable to rollback due to exception: %s.", ExceptionUtils.getRootCauseMessage(hex)));
            throw hex;
        } finally {
            if (session.isOpen()) {
                session.close();
            }
        }
    }
    

    Hibernate and C3P0 settings:

    <prop key="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
    <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
    
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
    <prop key="hibernate.show_sql">false</prop>
    <prop key="hibernate.current_session_context_class">thread</prop>
    <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>
    <prop key="hibernate.jdbc.batch_size">20</prop>
    <prop key="hibernate.order_inserts">true</prop>
    <prop key="hibernate.order_updates">true</prop>
    <prop key="hibernate.c3p0.timeout">1800 <!-- seconds --></prop>
    <prop key="hibernate.c3p0.min_size">4</prop>
    <prop key="hibernate.c3p0.max_size">35</prop>
    <prop key="hibernate.c3p0.idle_test_period">240 <!-- seconds --></prop>
    <prop key="hibernate.c3p0.acquire_increment">4</prop>
    <prop key="hibernate.c3p0.max_statements">0</prop>
    <prop key="hibernate.c3p0.preferredTestQuery">SELECT 1</prop>
    <prop key="c3p0.testConnectionOnCheckout">true</prop>
    <prop key="hibernate.connection.oracle.jdbc.ReadTimeout">60000 <!-- milliseconds --></prop>
    

    Not sure how the connection can be still in use and this error thrown. What is causing this error?