gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:47:12 28 4
gpt4 key购买 nike

在大型应用程序的某处,有一段代码没有按应有的方式将连接返回到连接池。结果是池很快达到了最大连接数。

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

如何在 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 安装它非常简单。

关于tomcat - 如何跟踪/记录 tomcat dbcp 池中的连接并检测不将连接返回到池的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34204577/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com