我们有一个使用Tomcat6和MySQL 5.0的Java Spring MVC2.5应用程序。我们有一个奇怪的场景,无论出于什么原因,c3p0连接池中使用的连接数量开始失控,最终导致tomcat崩溃。
我们通过JMX监控c3p0连接池,大多数时候,连接几乎不会被使用。当这种螺旋上升的情况发生时,我们的tomcat连接池就会耗尽,apache就会开始对线程进行排队。
在螺旋上升的场景中,数据库的负载很低,并且没有给出任何错误或任何明显的坏情况。
关于如何检测这个问题的想法开始耗尽了。我不认为做一个tomcat堆栈转储对我有任何好处,因为情况已经失控,我不确定如何在它失控之前抓住它。
我们也使用Terracotta,根据日志我不认为它做了什么奇怪的事情。
任何想法都将不胜感激!
干杯!
发布于 2013-03-27 02:43:34
你正在泄露连接的某个地方。当您显式地从会话工厂检索Hibernate会话,而不是获取与进程内事务相关联的连接时,可能会发生这种情况(不记得确切的方法名称)。
C3P0将允许您使用两个配置选项来调试这种情况(以下是从下载包中的文档复制的):
unreturnedConnectionTimeout定义了连接可以保持检出状态的时间限制(以秒为单位)。如果设置为非零值,则超过此限制的未返回的已签出连接将被立即销毁,然后在池中替换
将debugUnreturnedConnectionStackTraces设置为true,则每次签出连接时都会捕获堆栈跟踪。当未返回的连接超时时,将打印该堆栈跟踪,显示未及时签入的连接已签出的位置。debugUnreturnedConnectionStackTraces仅用于调试,因为捕获堆栈跟踪会降低连接签出的速度
https://stackoverflow.com/questions/15644526
复制相似问题