Java-приложение, использующее ojdbc6.jar, tomcat 7, tomcat-dbcp-8.0.3.jar (и другие jar-файлы, которые, вероятно, не относятся к этому вопросу), JDK 7 (u51)
Мы определили, что существует утечка соединения, используя отчет v $ session, где какое-то соединение переходит в НЕАКТИВНОЕ состояние на 7+ часов. Это также подтверждается дампом потока, взятым в замороженном состоянии.
Дамп кучи (взятый в замороженном состоянии) показывает:
- Total PoolableConnection и DefaultPooledObject равно maxTotal (ожидается для исчерпанного пула)
- Каждое соединение связано с PooledObjectState ALLOCATED
(Ожидаемый)
- lastReturnTime = lastUserTime = lastBorrowedTime (в
DefaultPooledObject), что для меня означает: THREAD-1 (хороший рабочий процесс)
вернул соединение, которое было немедленно заимствовано THREAD-2
(плохой рабочий процесс с утечкой) и THREAD-2 никогда не закрывали
связь, пусть болтается!
ВСЕ вышеприведенное наблюдение имеет смысл, поскольку у нас определенно есть утечка соединения и возможный исчерпанный пул
![allocated_pool_state](https://i.stack.imgur.com/ehSEW.png)
Мой вопрос:
Когда я вижу подробности о PoolableConnection, он ассоциируется с логическим _closed, который имеет значение «true». Почему / Как это могло иметь "_closed = true".
когда я декомпилировал tomcat-dbcp jar, я мог видеть, что каждый раз, когда _closed помечен как true, он также будет ассоциировать состояние IDLE с объектом соединения (вместо ALLOCATED).
![_closed PoolableConnection](https://i.stack.imgur.com/rsrb7.png)
Ищите теории о том, почему этот логический аргумент истинен.
PS: у нас есть различные идеи (например, установка logAbandoned), чтобы найти точный кусок кода, ответственный за утечку соединения, я с нетерпением жду, чтобы найти причину (или теорию) для дампа кучи для захвата этих PoolableConnection _closed = true.