c3p0 зависает в awaitAvailable с hibernate


У меня есть консольное приложение, которое зависает во время выполнения. Вот моя конфигурация:

    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");

Вот мой 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)

Я открываю только один conencton,и кажется, что я их не пропускаю. И еще я использую одну нить. Я не настраивал никаких настроек mysql, кроме использования памяти. Mysql прекрасно работает с консоли. Почему это может случиться? Это ошибка c3p0?

2 6

2 ответа:

Происходит ли это сразу или через некоторое время? то есть, сначала проверки проходят успешно, а потом висят вот так? если да, то это выглядит как утечка соединения. пожалуйста, попробуйте установить параметры c3p0 unreturnedConnectionTimeout и debugUnreturnedConnectionStackTraces, чтобы увидеть, есть ли утечка. Видеть 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 .

Если это происходит немедленно, если ни одно соединение не было успешно проверено, возникает вопрос, будет ли пул когда-либо успешно получать соединения. по умолчанию, если это никогда не удается, примерно через 30 секунд поток должен прерваться с ошибкой. (не похоже, что вы это сделали, но если, например, вы установите acquireRetryAttempts в ноль, c3p0 может висеть бесконечно, ожидая Подключение.)

Для отладки проблем c3p0 полезно захватить информацию о версии и конфигурации, которую c3p0 сбрасывает в журналы на уровне информации при инициализации пула.

Удачи!

Кроме того, вы, кажется, не инициализировали параметр checkoutTime для c3p0, который указывает количество времени, которое клиент должен ждать получения соединения из пула соединений.

См. http://www.mchange.com/projects/c3p0/#checkoutTimeout