Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

No operations allowed after connection closed

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?

like image 466
tuxx Avatar asked Dec 17 '14 18:12

tuxx


1 Answers

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.

like image 82
Eric Leschinski Avatar answered Oct 29 '22 17:10

Eric Leschinski