2012-05-03 6 views
7

Używam puli połączeń C3P0 z Hibernacja do wykonywania niektórych operacji JDBC. Jednak otrzymuję komunikat "Błąd połączenia" (błąd SQL: 17008, SQLState: null) po pewnym czasie użytkowania.Czy powinien zostać zamknięty argument "connection" dla doWork()?

Używam interfejsu org.hibernate.jdbc.Work wykonywać swoje operacje:

public class ClassThatDoesWork implements Work { 

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

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

Moje pytanie brzmi: czy obiekt connection przekazany jako argument do metody execute() być zamknięty pod koniec tej metody lub hibernacji dba do tego automatycznie?

EDIT Są to parametry hibernacji i C3P0 stosowane:

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

Za każdym razem, gdy korzystam z C3P0, jego ustawienia są określone bez prefiksu hibernacji. To znaczy. c3p0.min_size = 5 zamiast hibernate.c3p0.min_size = 5. Pls również wypróbować ustawienie c3p0.idle_test_period według mojej odpowiedzi. – 01es

+0

Patrz [ta część dokumentacji c3p0] (http://www.mchange.com/projects/c3p0/index.html#hibernate-specific). Właściwości są poprzedzone prefiksem "hibernate.c3p0". Wrócę, gdy spróbuję ustawienia c3p0.idle_test_period. – nekojsi

+0

Niestety, okazało się, że w ogóle nie korzystaliśmy z C3P0, ponieważ nie zostało ono poprawnie odebrane jako zależność, więc prawdopodobnie naprawi problem "Connection Closed", niezależnie od właściwości c3p0.idle_test_period. Jednak nadal jestem zainteresowany, czy obiekt 'connection' powinien być obsługiwany przez mój kod, czy też Hibernate zajmie się nim automatycznie. – nekojsi

Odpowiedz

8

Baza połączenie jest przekazywane jako metoda A argument hibernacji, a zatem nie powinny być skłonny z (na przykład zamknięty) wewnątrz metody - - to jest odpowiedzialność Hibernate.