日期:2014-05-19  浏览次数:20769 次

什么导致了c3p0死锁.
环境:
tomcat6配置2个虚拟主机项目web1和web2分别绑定2个域名.
2个项目基本上是90%相同的,主要修改了皮肤,所以用的连接池都是c3po.
2个项目链接的数据库都是本地同一mysql下2个不同的库db1和db2

这个web项目在其他机器上还有一份部署,模式是tomcat+web+db,项目只有一个,数据库独享,这个项目运行30天无故障.
现在问题是:
上面把这个项目部署成2个虚拟主机时,撑不过24小时,就会报错:
-----com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
警告: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@785308d1 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!

网上查了很多问题,好像都是c3p0造成的,但是单独的项目又好好的,估计可能是共享部署的原因,望高手指点!

------解决方案--------------------
c3po过度到proxool
------解决方案--------------------
引用:
环境:
tomcat6配置2个虚拟主机项目web1和web2分别绑定2个域名.
2个项目基本上是90%相同的,主要修改了皮肤,所以用的连接池都是c3po.
2个项目链接的数据库都是本地同一mysql下2个不同的库db1和db2

这个web项目在其他机器上还有一份部署,模式是tomcat+web+db,项目只有一个,数据库独享,这个项目运行30天无故障.
现在问题是:
上面把这个项目……

<!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements
       属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。
       如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->
 <property name="maxStatements" value="0"/>
<!--连接池用完时客户调用getConnection()后等待获取连接的时间,单位:毫秒。超时后会抛出-->
 <!--SQLEXCEPTION,如果设置0,则无限等待。Default:0-->
 <property name="checkoutTimeout" value="100"/>
------解决方案--------------------
虽然共用了tomcat,但是不同项目
虽然共用了mysql,但是不同数据库

难道所使用的c3p0的连接池实例是同一个吗?如果是因为这个引起的死锁问题,要么连接池方有相关配置可以修改,要么就是尝试换连接池,因为貌似都是外设的事情,和业务逻辑无关。