尝试识别 tomcat 中废弃连接的来源

2024-02-22

我在 tomcat(版本 7)中使用 dbcp 连接池,并且我的代码中某处存在连接泄漏。一小段时间后,新连接的请求将返回以下异常:

“无法获取连接,池错误等待空闲对象超时”

我回顾了我的代码,对我来说,看起来所有连接都已正确关闭(不是每个人都这么说......)。

为了调试这个问题,我在 context.xml 中添加了以下属性:

logAbandoned="true" removeAbandoned="true" removeAbandonedTimeout="300"

所以资源标签现在看起来像这样:

 <Resource name="jdbc/findata" auth="Container" type="javax.sql.DataSource"
               maxActive="20" maxIdle="5" maxWait="10000"
               username="root" password="xxxxxx" driverClassName="com.mysql.jdbc.Driver"
               logAbandoned="true" removeAbandoned="true" removeAbandonedTimeout="300"
               url="jdbc:mysql://localhost:3306/findata"/>

然后我重新启动 tomcat 并开始访问网页,直到出现错误消息(在浏览器窗口中)。但是我还无法弄清楚“logAbandoned”属性在哪里写入其信息。我正在寻找

/usr/share/apache-tomcat-7.0.11/logs

但其中唯一最近修改的日志文件是

localhost_access_log.2011-04-18.txt

非常感谢任何帮助。


根据这个网站 http://www.tomcatexpert.com/blog/2010/04/01/configuring-jdbc-pool-high-concurrency您必须从 context.xml 中为资源定义提供一个工厂。资源的配置将由该工厂实例完成,因此所有“附加”参数都以这种方式设置。更具体地说,您的 context.xml (或 server.xml - 取决于您定义资源的位置)中会有类似的内容:

<Resource name="jdbc/db" auth="Container" type="javax.sql.DataSource"
 factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
 driverClassName="org.postgresql.Driver" url="jdbc:postgresql://127.0.0.1/db"
 username="hibernate" password="hibernate" maxActive="20" maxIdle="10"
 maxWait="1000" removeAbandoned="true" removeAbandonedTimeout="20"
 logAbandoned="true" />  

注意factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"这对于我们的目的至关重要。没有它removeAbandoned="true"没有影响。

每个被放弃的连接的堆栈存储在catalina.log中($tomcat_dir/logs)。从那里它将提供用于调试连接的非常准确的详细信息。

除了“废弃”参数之外,您还可以配置许多与 tomcat jdbc 池性能、超时和其他色调和螺栓相关的内容。当然,这需要一些深厚的专业知识。 (您可以在我最初提供的网站中找到详细信息)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试识别 tomcat 中废弃连接的来源 的相关文章

随机推荐