2012-12-31 11 views
6

Ho un'applicazione console che si blocca durante l'esecuzione. Qui è la mia configurazione:c3p0 si blocca in attesaDisponibile con ibernazione

cfg.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver"); 
    cfg.setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/db?user=db&password=db"); 
    cfg.setProperty("hibernate.connection.username", "db"); 
    cfg.setProperty("hibernate.connection.password", "db"); 
    cfg.setProperty("hibernate.connection.pool_size", "5"); 
    cfg.setProperty("hibernate.connection.autocommit", "false"); 
    cfg.setProperty("hibernate.c3p0.min_size", "5"); 
    cfg.setProperty("hibernate.c3p0.max_size", "20"); 
    cfg.setProperty("hibernate.c3p0.timeout", "300"); 
    cfg.setProperty("hibernate.c3p0.max_statements", "50"); 
    cfg.setProperty("hibernate.c3p0.idle_test_period", "3000"); 

Ecco il mio stacktrace:

"main" prio=10 tid=0x000000000168f800 nid=0x1c37 in Object.wait() [0x00007fa60d0ad000] 
    java.lang.Thread.State: WAITING (on object monitor) 
     at java.lang.Object.wait(Native Method) 
     - waiting on <0x00000007400f4c68> (a com.mchange.v2.resourcepool.BasicResourcePool) 
     at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1315) 
     at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557) 
     - locked <0x00000007400f4c68> (a com.mchange.v2.resourcepool.BasicResourcePool) 
     at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477) 
     at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525) 
     at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128) 
     at org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:84) 
     at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:281) 
     at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:297) 
     at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:169) 
     at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:67) 
     at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:160) 
     at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1392) 
     at org.kriyak.parser.IndexArchiveRapid.indexFile(IndexArchiveRapid.java:70) 
     at org.kriyak.parser.IndexArchiveRapid.main(IndexArchiveRapid.java:53) 

Apro una sola conencton e non sembra che io li perdita. E anche io uso un thread. Non ho regolato alcuna impostazione di mysql tranne l'utilizzo della memoria. Mysql funziona bene dalla console. Perché può accadere? È questo errore c3p0?

+0

È l'unico thread nella vostra applicazione? – parsifal

+0

sì, è l'unico thread –

risposta

13

ciò avviene immediatamente o dopo un po '? cioè, il checkout ha inizialmente successo, ma poi si blocca così? se è così, sembra una perdita di connessione. prova a impostare c3p0 params unreturnedConnectionTimeout e debugUnreturnedConnectionStackTraces per vedere se c'è una perdita. Vedi http://www.mchange.com/projects/c3p0/#configuring_to_debug_and_workaround_broken_clients, http://www.mchange.com/projects/c3p0/#unreturnedConnectionTimeout, http://www.mchange.com/projects/c3p0/#debugUnreturnedConnectionStackTraces.

se ciò accade immediatamente, se nessuna connessione è stata verificata correttamente, la domanda è se il pool riesce sempre ad acquisire Connections. per impostazione predefinita, se non riesce mai, dopo circa 30 secondi il thread dovrebbe interrompersi con un errore. (non sembra che tu abbia fatto questo, ma se per esempio avresti impostato acquireRetryAttempts su zero, c3p0 potrebbe bloccarsi indefinitamente in attesa di Connessioni.)

per eseguire il debug dei problemi di c3p0, è utile acquisire la versione e config informazioni che c3p0 fa il dump ai log al livello INFO sull'inizializzazione del pool.

buona fortuna!

+0

Mi mancava sess.close(). Accetto la tua risposta –

+0

Non stavo chiudendo la connessione sottostante, che è stata esplicitamente richiesta nel mio caso. – Niranjan

3

Inoltre, non sembra che il parametro checkoutTime sia stato inizializzato per c3p0, che specifica la quantità di tempo che un client deve attendere per l'acquisizione di una connessione dal pool di connessioni.

vedi http://www.mchange.com/projects/c3p0/#checkoutTimeout