我们有一个使用Tomcat 6和MySQL 5.0的Java Spring MVC 2.5应用程序。我们有一个奇怪的场景,无论出于何种原因,c3p0连接池中使用的连接数量开始失控,最终导致tomcat失效。
我们通过JMX监控c3p0连接池,大多数情况下,连接几乎没有使用。当这种螺旋式情况发生时,我们的tomcat连接池最大化并且apache开始排队线程。
在螺旋式场景中,数据库负载较低,没有出现任何错误或任何明显的不良情况。
开始没有关于如何检测此问题的想法。我不认为做一个tomcat堆栈转储对我有任何好处,当情况已经失控失控并且不确定如何在它失控之前能够捕获它。
我们也使用Terracotta,我不相信日志它做了什么奇怪的事。
任何想法都将不胜感激!
干杯!
答案 0 :(得分:0)
某处你正在泄露连接。当您从会话工厂显式检索Hibernate会话时,可能会发生这种情况,而不是获取与进程内事务关联的连接(无法记住确切的方法名称)。
C3P0将允许您使用两个配置选项调试此情况(以下内容是从文档中复制的,这些文档是下载包的一部分):
unreturnedConnectionTimeout定义Connection可以保持签出的时间限制(以秒为单位)。如果设置为nozero值,则超出此限制的未签回,签出的Connections将被立即销毁,然后在池中替换
将debugUnreturnedConnectionStackTraces设置为true,然后每次签出Connection时都会捕获堆栈跟踪。每当未退回的连接超时时,将打印该堆栈跟踪,显示未检出的连接未立即检入的位置。 debugUnreturnedConnectionStackTraces仅用于调试,因为捕获堆栈跟踪会降低连接签出速度