Я использую c3p0 ComboPooledDataSource для объединения соединений с базой данных (к базе данных Oracle 10g). У меня проблемы с обработкой сбоев подключения к базе данных.
Если нет соединения с базой данных, когда устанавливается первое соединение, срабатывает тайм-аут проверки, и происходит сбой, как и ожидалось.
Однако, если обрыв соединения происходит после того, как одно или несколько соединений были получены и уже находятся в пуле соединений, вызов getConnection() просто зависает. Никаких исключений не выбрасывается. Я предполагаю, что это связано с тем, что он пытается использовать объединенное соединение, но это соединение больше не работает.
Есть ли способ проверить, действительно ли соединение, прежде чем пытаться его использовать? Я попытался установить testConnectionOnCheckout=true, но, похоже, это не имеет никакого эффекта.
Это дамп темы
C3P0PooledConnectionPoolManager[identityToken->2rvy8f8x1oujxrx1majv5s|be41d5]- HelperThread-#2" демон prio=6 tid=0x0307a800 nid=0x840 в Object.wait() [0x03d1f000] java.lang.Thread.State: TIMED_WAITING (на мониторе объекта) at (на объектном мониторе) .lang.Object.wait (собственный метод) — ожидание ‹0x28387f88> (com.mchange.v2.async.ThreadPoolAsynchronousRunner) в com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:635) — заблокировано ‹0x28387f88> (com.mchange.v2.async.ThreadPoolAsynchronousRunner)
Блокированные собственные синхронизаторы: - Нет