我在 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(使用前将#替换为@)