Как отслеживать / регистрировать соединения в пуле tomcat dbcp и обнаруживать код, который не возвращает соединение с пулом

Где-то в большом приложении есть какой-то фрагмент кода, который не возвращает соединение с пулом соединений, как должно. В результате пул быстро достигает максимального количества подключений.

Это можно обойти, настроив его на удаление брошенных подключений, но это снижает производительность.

Как я могу включить ведение журнала в tomcat dbcp, чтобы показывать, когда соединения заимствованы и возвращены?


person Yiannis    schedule 10.12.2015    source источник
comment
Покажите нам, как вы настроили пул tomcat. Вы используете источник данных или напрямую обращаетесь к пулу?   -  person Jeff Miller    schedule 10.12.2015


Ответы (1)


Регистрация заимствования и возврата подключения

Я задал этот вопрос, чтобы дать свой ответ. Вероятно, не у многих людей есть эта проблема, но это была настоящая проблема - отследить код, который оставил соединения открытыми. Я собрал решение, описанное здесь, в небольшом проекте на github: https://github.com/chronakis/dbcp-conn-log. Вы можете пойти туда или продолжить, чтобы получить краткое описание здесь.

Похоже, что Tomcat DBCP не построил ведение журнала после проверки источника. Лучший способ, который я нашел, - это использовать AspectJ для создания метода ведения журнала вокруг методов, которые получают соединение из пула, и кода, который возвращает соединение с пулом. Методы ведения журнала печатают короткую удобную трассировку вызовов, которая показывает часть кода, которая открывает и возвращает соединения, как показано ниже:

+++ getConnection(52d02201): MyDAOSQL.getConnection(69) > MyDAOSQL.getCustomerByName(568) > ...
--- retConnection(52d02201): MyDAOSQL.getCustomerByName(568) > CustomerController.getCustomer(67) > ...
+++ getConnection(7100721a): MyDAOSQL.getConnection(69) > MyDAOSQL.getBasket(568) > ...
--- retConnection(7100721a): MyDAOSQL.getBasket(568) > CustomerController.getBasket(67) > ...

Предполагая, что вы используете java.sql.DataSource в контексте xml, методы, которые получают и возвращают соединения:

Получить: org.apache.tomcat.dbcp.dbcp2.PoolingDataSource.getConnection
Возврат: org.apache.tomcat.dbcp.dbcp2.PoolingDataSource.PoolGuardConnectionWrapper.close

Зная это, несложно создать методы ведения журнала вокруг этих методов и скомпилировать их в код с помощью плагина AspectJ maven, как показано в проекте здесь: Я собрал эти файлы в небольшой проект на github: https://github.com/chronakis/dbcp-conn-log

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

Регистрация фактической активности sql

Если вам нужны дополнительные подробности, вы можете использовать что-то вроде p6spy (поиск в github) для отслеживания уровня JDBC до запросов sql. Установить его, особенно с maven, довольно просто.

person Yiannis    schedule 10.12.2015
comment
Просто хочу поблагодарить за этот ответ - он помог мне решить проблему, которая беспокоила меня несколько месяцев. - person Tom Warfield; 23.08.2016