2014-12-17 26 views
7

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?

+0

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. –

+0

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

Trả lời

3

phương thức Java này gọi executeQuery:

your_database_connection.createStatement().executeQuery(your_string_query); 

sẽ ném ngoại lệ này:

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

nếu bạn cố gắng chạy nó (executeQuery) sau khi gọi:

your_database_connection.close() 

gì đang xảy ra

Hoặc bạn đang cố gắng để có được một kết nối đến cơ sở dữ liệu và không nhận được một, và đang cố gắng chạy một truy vấn đối với nó không thành công. Hoặc bạn có một kết nối bị một số vấn đề và bị đóng, và bạn đã thử chạy một truy vấn khác thông qua nó.

Giải pháp

Giả sử bạn bị mất kết nối khỏi các vấn đề mạng hoặc cái gì đó không phải là lỗi của bạn, sau đó đặt các mã mà cố gắng truy vấn trong một khối try/catch, và về lỗi chờ 10 giây và kết nối lại với cơ sở dữ liệu.

0

idleConnectionTestPeriod của bạn là 240, nó sẽ ít hơn nhưng db chờ đợi giá trị thời gian chờ, xem cấu hình db, kiểm tra giá trị lớn hơn 240.

Các vấn đề liên quan