我在tomcat(版本7)中使用dbcp连接池,并且我的代码中有某个连接泄漏.在很短的时间之后,对新连接的请求将返回以下异常:
"无法获取连接,池错误超时等待空闲对象"
我回过头来看看我的代码,看起来所有的连接都被正确关闭了(并不是每个人都说这个......).
为了调试这个,我在context.xml中添加了以下属性:
logAbandoned="true" removeAbandoned="true" removeAbandonedTimeout="300"
Run Code Online (Sandbox Code Playgroud)
所以资源标签现在看起来像这样:
<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"/>
Run Code Online (Sandbox Code Playgroud)
然后我重新启动了tomcat并开始点击网页,直到出现错误消息(在浏览器窗口中).但是我还没有弄清楚"logAbandoned"属性在哪里写信息.我正在寻找
/usr/share/apache-tomcat-7.0.11/logs
Run Code Online (Sandbox Code Playgroud)
但是那里唯一最近修改过的日志文件就是
localhost_access_log.2011-04-18.txt
Run Code Online (Sandbox Code Playgroud)
非常感谢任何帮助.
小智 7
根据此站点,您必须从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" />
Run Code Online (Sandbox Code Playgroud)
请注意factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"哪个对我们的目的至关重要.没有它就removeAbandoned="true"没有效果.
放弃的每个连接的堆栈存储在catalina.log($tomcat_dir/logs)中.从那里它将为调试连接提供非常准确的细节.
除了"废弃"参数,你可以配置很多关于tomcat jdbc池性能,超时和其他色调和螺栓的东西.当然,这需要一些深刻的专业知识.(您可以在我最初提供的网站中找到详细信息)
我在类似的场景中所做的是保存请求连接的线程的线程堆栈,然后在另一个线程中每分钟左右打印出与每个打开的连接相关的线程堆栈。我想这是用蛮力的方式来做这件事。但我很快就解决了我的问题。
| 归档时间: |
|
| 查看次数: |
14594 次 |
| 最近记录: |