Потоки помощника c3po будут взаимоблокироваться - PullRequest
4 голосов
/ 11 января 2012

Я использовал c3po pooling с моим графическим приложением.У меня есть следующая конфигурация

overrides.put("maxStatementsPerConnection", 30);
overrides.put("maxPoolSize",70); 
overrides.put("checkoutTimeout", 50000);

Иногда я попадаю в ситуацию, когда попытка установить время ожидания соединения

java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
    at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106)
    at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:65)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:527)
    at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128)
    at com.jthink.jaikoz.db.Db.createConnection(Db.java:402)

Даже если я уверен, что у меня нет других открытых соединений,На самом деле я имел обыкновение включать некоторые дополнительные опции (debugUnreturnedConnectionStackTraces, unreturnedConnectionTimeout), чтобы попытаться выявить проблемы с не закрытием соединений, и не обнаружил проблем.Эта проблема возникает редко и возникает только после ее запуска в течение некоторого времени.Я использую со встроенной базой данных Derby.

К счастью, в случае неудачи на этот раз я запустил ее с включенным Yourkit Profiler, и я мог выполнить профилирование монитора и обнаружил, чтоу нас есть три нити c3po, все ожидающие друг друга, поэтому я думаю, что здесь на самом деле тупик

com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread#0
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread#1
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread#2

Это похоже на настройку numHelperThreads?

Я взялскриншот этого

enter image description here

Нашел ли я проблему с c3po, могу ли я написать код для ее восстановления?

1 Ответ

1 голос
/ 14 августа 2012

Три потока, которые вы видите, действительно являются вспомогательными. Они асинхронно замедляют операции JDBC, например, закрывают неиспользуемые соединения. Последняя строка трассировки стека

com.jthink.jaikoz.db.Db.createConnection(Db.java:402)

указывает на то, что C3P0 пытается открыть новое соединение, но база данных отказывается его создать. Я предполагаю, что база данных 'Jaikoz' отклоняет соединение, пул соединений C3P0 здесь не проблема.

Simon

...