如何检测tomcat连接池问题

时间:2013-03-26 18:18:17

标签: java mysql spring tomcat c3p0

我们有一个使用Tomcat 6和MySQL 5.0的Java Spring MVC 2.5应用程序。我们有一个奇怪的场景,无论出于何种原因,c3p0连接池中使用的连接数量开始失控,最终导致tomcat失效。

我们通过JMX监控c3p0连接池,大多数情况下,连接几乎没有使用。当这种螺旋式情况发生时,我们的tomcat连接池最大化并且apache开始排队线程。

在螺旋式场景中,数据库负载较低,没有出现任何错误或任何明显的不良情况。

开始没有关于如何检测此问题的想法。我不认为做一个tomcat堆栈转储对我有任何好处,当情况已经失控失控并且不确定如何在它失控之前能够捕获它。

我们也使用Terracotta,我不相信日志它做了什么奇怪的事。

任何想法都将不胜感激!

干杯!

1 个答案:

答案 0 :(得分:0)

某处你正在泄露连接。当您从会话工厂显式检索Hibernate会话时,可能会发生这种情况,而不是获取与进程内事务关联的连接(无法记住确切的方法名称)。

C3P0将允许您使用两个配置选项调试此情况(以下内容是从文档中复制的,这些文档是下载包的一部分):

  

unreturnedConnectionTimeout定义Connection可以保持签出的时间限制(以秒为单位)。如果设置为nozero值,则超出此限制的未签回,签出的Connections将被立即销毁,然后在池中替换

     

将debugUnreturnedConnectionStackTraces设置为true,然后每次签出Connection时都会捕获堆栈跟踪。每当未退回的连接超时时,将打印该堆栈跟踪,显示未检出的连接未立即检入的位置。 debugUnreturnedConnectionStackTraces仅用于调试,因为捕获堆栈跟踪会降低连接签出速度