Я использовал 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
?
Я взялскриншот этого
Нашел ли я проблему с c3po, могу ли я написать код для ее восстановления?