2012-05-03 4 views
7

私はいくつかのJDBC操作を実行するために、HibernateでC3P0接続プールを使用しています。しかし、私は、 "Closed Connection"(SQLエラー:17008、SQLState:null)というエラーが発生しました。doWork()の "connection"引数を閉じるべきですか?

私は私の操作を実行するorg.hibernate.jdbc.Workインタフェースを使用しています:

public class ClassThatDoesWork implements Work { 

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

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

私の質問は:​​メソッドに引数として渡さconnectionオブジェクトは、そのメソッドの最後に閉鎖されるか、Hibernateは世話をする必要がありますそれは自動的にですか?

EDIT これらを使用HibernateとC3P0パラメータである:

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

私がC3P0を使用するたびに、その設定は休止状態のプレフィックスなしで指定されます。私。 hibernate.c3p0.min_size = 5の代わりにc3p0.min_size = 5。 Plsはまた、私の答えごとにc3p0.idle_test_period設定を試してみます。 – 01es

+0

[c3p0ドキュメントのこの部分](http://www.mchange.com/projects/c3p0/index.html#hibernate-specific)を参照してください。プロパティの前には "hibernate.c3p0"という接頭辞が付いています。私はc3p0.idle_test_periodの設定を試してみると戻ってきます。 – nekojsi

+0

申し訳ありませんが、C3P0をまったく使用していないことが判明しました。依存関係として正しく選択されていないため、c3p0.idle_test_periodプロパティに関係なく、「Connection Closed」問題が修正される可能性があります。しかし、 'connection'オブジェクトが自分のコードによって維持されるべきか、Hibernateが自動的にそれを世話する場合、私はまだ興味があります。 – nekojsi

答えて

8

データベース接続が休止状態によってメソッド引数として渡され、従って、メソッド内(例えば、閉鎖)と誘惑されるべきではありません - これはHibernateの責任です。

関連する問題