Должен ли аргумент соединения doWork() быть закрытым?

Я использую пул соединений C3P0 с Hibernate для выполнения некоторых операций JDBC. Однако после некоторого времени использования я получаю сообщение об ошибке «Закрытое соединение» (ошибка SQL: 17008, SQLState: null).

Я использую интерфейс 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, переданный в качестве аргумента методу execute(), закрываться в конце этого метода, или Hibernate позаботится об этом автоматически?

РЕДАКТИРОВАТЬ Это используемые параметры 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

person nekojsi    schedule 03.05.2012    source источник
comment
Каждый раз, когда я использую C3P0, его настройки указываются без префикса hibernate. т.е. c3p0.min_size=5 вместо hibernate.c3p0.min_size=5. Пожалуйста, также попробуйте настройку c3p0.idle_test_period согласно моему ответу.   -  person 01es    schedule 03.05.2012
comment
См. эту часть документации c3p0. Свойства действительно имеют префикс hibernate.c3p0. Я вернусь, как только попробую настройку c3p0.idle_test_period.   -  person nekojsi    schedule 03.05.2012
comment
Извините, получается, что мы вообще не использовали C3P0, так как он не правильно подцепился как зависимость, так что это, вероятно, исправит проблему Connection Closed, вне зависимости от свойства c3p0.idle_test_period. Тем не менее, мне все еще интересно, должен ли мой код поддерживать объект connection или Hibernate позаботится об этом автоматически.   -  person nekojsi    schedule 04.05.2012
comment
Он передается в качестве аргумента метода Hibernate, и поэтому его не следует соблазнять (например, закрывать) внутри метода — это ответственность Hibernate.   -  person 01es    schedule 04.05.2012
comment
Спасибо! Пожалуйста, укажите это в своем ответе, чтобы я мог его принять.   -  person nekojsi    schedule 04.05.2012


Ответы (1)


Соединение с базой данных передается Hibernate в качестве аргумента метода, и поэтому не следует соблазняться (например, закрытым) внутри метода - это ответственность Hibernate.

person 01es    schedule 03.05.2012