9

在大型应用程序的某个地方,有一些代码没有按应有的方式返回连接池的连接。结果是池迅速达到最大连接数。

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

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

4

1 回答 1

8

记录连接借用和归还

我问这个问题是为了提供我自己的答案。可能没有很多人有这个问题,但跟踪打开连接的代码是一个真正的挑战。我将这里描述的解决方案放在一个小型 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 安装它非常简单。

于 2015-12-10T14:58:04.817 回答