Tôi nhận được lỗi này từ một ứng dụng Java:Không hoạt động cho phép sau khi kết nối đóng
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!
Mã Java:
try {
sessionFactory.beginTransaction();
//...
sessionFactory.commitTransaction();
} catch (Exception e) {
sessionFactory.rollbackTransaction();
throw new RuntimeException(e);
}
Nhà máy phiên:
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 và cài đặt C3P0:
<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>
Không chắc chắn cách kết nối có thể vẫn được sử dụng và lỗi này được ném. Điều gì gây ra lỗi này?
Tôi không thể nói chắc chắn mà không nhìn thấy tất cả các mã, nhưng bạn có đóng phiên sau khi cam kết thành công không? Tôi không thấy điều đó trong đoạn mã trên. Nếu không, bạn đang cạn kiệt hồ bơi kết nối của mình. –
Phiên sẽ tự động đóng khi giao dịch được thực hiện: https://developer.jboss.org/wiki/Sessionsandtransactions?_sscc=t#jive_content_id_Transaction_demarcation_with_plain_JDBC. – tuxx