2012-05-03 14 views
7

Sto utilizzando un pool di connessioni C3P0 con Hibernate per eseguire alcune operazioni JDBC. Tuttavia, ricevo un errore "Closed Connection" (errore SQL: 17008, SQLState: null) dopo un certo periodo di utilizzo.L'argomento "connessione" di doWork() deve essere chiuso?

Sto usando l'interfaccia org.hibernate.jdbc.Work per eseguire le mie operazioni:

public class ClassThatDoesWork implements Work { 

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

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

La mia domanda è: deve l'oggetto connection passato come argomento al metodo execute() essere chiusa alla fine di quel metodo o Hibernate si prende cura per quello automaticamente?

EDIT Questi sono i parametri Hibernate e c3p0 utilizzati:

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

Ogni volta che utilizzo C3P0, le sue impostazioni vengono specificate senza il prefisso di ibernazione. Cioè c3p0.min_size = 5 invece di hibernate.c3p0.min_size = 5. Pls prova anche l'impostazione c3p0.idle_test_period come da mia risposta. – 01es

+0

Vedere [questa parte della documentazione di c3p0] (http://www.mchange.com/projects/c3p0/index.html#hibernate-specific). Le proprietà sono infatti precedute da "hibernate.c3p0". Tornerò dopo aver provato l'impostazione c3p0.idle_test_period. – nekojsi

+0

Scusa, si scopre che non stavamo utilizzando C3P0, poiché non è stato rilevato correttamente come dipendenza, quindi questo probabilmente risolverà il problema "Connessione chiusa", indipendentemente dalla proprietà c3p0.idle_test_period. Tuttavia, sono ancora interessato se l'oggetto 'connection' debba essere mantenuto dal mio codice o Hibernate se ne occupa automaticamente. – nekojsi

risposta

8

Il database di connessione viene passata come argomento metodo da sospensione, e quindi non deve essere tentato con (es chiuso) nel metodo - - questa è la responsabilità di Hibernate.

Problemi correlati