2012-05-03 29 views
7

Tôi đang sử dụng một Hồ bơi kết nối C3P0 với Hibernate để thực thi một số hoạt động JDBC. Tuy nhiên, tôi nhận được một lỗi "Closed Connection" (Lỗi SQL: 17008, SQLState: null) sau một thời gian sử dụng.Đối số "kết nối" của doWork() có bị đóng không?

Tôi đang sử dụng giao diện org.hibernate.jdbc.Work để thực hiện các hoạt động của tôi:

public class ClassThatDoesWork implements Work { 

    @Override 
    public void execute(final Connection connection) 
      throws SQLException { 

     doSomeWork(); 
     //should connection be closed here? 
    } 
} 

Câu hỏi của tôi là: nên đối tượng connection thông qua như là một cuộc tranh cãi với phương pháp execute() bị đóng cửa vào cuối của phương pháp đó hoặc Hibernate sẽ chăm sóc cho điều đó tự động?

EDIT Đây là những thông số Hibernate và C3P0 sử dụng:

hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver 
hibernate.connection.pool_size=10 
hibernate.dialect=org.hibernate.dialect.Oracle9iDialect 
hibernate.connection.provider_class=org.hibernate.connection.C3P0ConnectionProvider 
hibernate.show_sql=false 
acquireIncrement=3 
acquireRetryDelay=500 
acquireRetryAttempts=5 
breakAfterAcquireFailure=false 
checkoutTimeout=0 
connectionTesterClassName=com.mchange.v2.impl.DefaultConnectionTester 
debugUnreturnedConnectionStackTraces=false 
dataSourceName=irrelevantDB 
identityToken=irrelevantDB 
idleConnectionTestPeriod=0 
initialPoolSize=3 
maxConnectionAge=0 
maxIdleTime=7200 
maxIdleTimeExcessConnections=0 
maxPoolSize=20 
maxStatements=50 
maxStatementsPerConnection=0 
minPoolSize=5 
numHelperThreads=3 
propertyCycle=0 
testConnectionOnCheckin=false 
testConnectionOnCheckout=true 
unreturnedConnectionTimeout=0 
hibernate.c3p0.min_size=5 
hibernate.c3p0.max_size=20 
hibernate.c3p0.timeout=10 
hibernate.c3p0.max_statements=50 
+0

Mỗi khi tôi sử dụng C3P0, cài đặt của nó được chỉ định mà không có tiền tố ngủ đông. I E. c3p0.min_size = 5 thay vì hibernate.c3p0.min_size = 5. Xin vui lòng thử các thiết lập c3p0.idle_test_period theo câu trả lời của tôi. – 01es

+0

Vui lòng xem [phần này của tài liệu c3p0] (http://www.mchange.com/projects/c3p0/index.html#hibernate-specific). Các thuộc tính thực sự có tiền tố là "hibernate.c3p0". Tôi sẽ quay trở lại khi tôi thử cài đặt c3p0.idle_test_period. – nekojsi

+0

Xin lỗi, nó chỉ ra rằng chúng tôi đã không sử dụng C3P0 ở tất cả, vì nó đã không được chọn chính xác như một phụ thuộc, vì vậy điều này có thể sẽ khắc phục vấn đề "Connection Closed", bất kể thuộc tính c3p0.idle_test_period. Tuy nhiên, tôi vẫn quan tâm nếu đối tượng 'connection' nên được duy trì bởi mã của tôi hoặc Hibernate sẽ tự động xử lý nó. – nekojsi

Trả lời

8

Cơ sở dữ liệu kết nối được thông qua tại như một đối số phương pháp mà theo Hibernate, và do đó không nên bị cám dỗ với (ví dụ như đóng) trong phương pháp này - - đây là trách nhiệm của Hibernate.

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