繁体   English   中英

如何跟踪/记录 tomcat dbcp 池中的连接并检测不返回连接到池的代码

[英]How to track/log connections in tomcat dbcp pool and detect code that does not return connection to the pool

在大型应用程序的某个地方,有一些代码没有像它应该的那样返回到连接池的连接。 结果是池快速达到最大连接数。

这可以通过将其设置为删除废弃连接来解决,但会降低性能。

如何启用登录 tomcat dbcp 以显示何时借用和返回连接?

记录连接借用和归还

我问这个问题是为了提供我自己的答案。 可能没有多少人有这个问题,但追踪导致连接打开的代码是一个真正的挑战。 我已经在一个小型 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) > ...

假设您在上下文 xml 中使用java.sql.DataSource ,获取和返回连接的方法是:

获取: 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 安装它非常简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM