c3p0作为目前主流的数据库连接池之一,已经得到频繁的使用,在此之前出来没有发生过类似情况,直至去年开始做集成平台,使用c3p0做连接池,开发、测试环境一切正常,但是正常部署以后,tomcat运行一段时间就会进入假死转态,一开始以为是tomcat作为中间件无法支撑过大的访问量造成的,对tomcat进行各种监测,始终无法解决,最后在偶然的机会看到了一篇关于c3p0的介绍,才将目标转向数据库连接池:
c3p0: c3p0提供最大空闲时间,当连接时间超过最大连接时间,就会断开当前连接,但是当遇到高并发的时候就会出现连接数占满后无法获取连接的情况,因为无法正常获取连接导致服务接收到请求以后无法继续往下执行,形成tomcat假死的情况。
解决方案:
1、修改c3p0配置:
breakAfterAcquireFailure=false,为true会导致连接池占满后不提供服务。所以必须为false。(单纯的修改最大连接数无法解决问题)
2、替换连接池:
将数据库连接池替换成dbcp