最近把C3P0拿来作为数据库连接池,起初只连接一个sqlserver,感觉还比较正常,然后又加了一个数据源,是个oracle,问题就开始出现了。经常是每天早上刚上班就莫名其妙的报死锁,或者是等午休结束后刚开始登录使用就报死锁,网上搜了很多贴着,说是c3p0自身的bug,放大连接池数就OK了,随即把maxPoolSize从20调到了100,并把内存也放大了,发现的确有所缓解,但只是缓解,死锁的频率降低了一点,但还是经常会出现。
实在无奈,就继续查资料,无意中发现另一个sqlserver数据库(不是这里提到的c3p0的一个数据源)有这样一条配置:validationQuery="select 1",查了下意思,大概就是说连接长期不使用时,连接池会自动从数据库中断开该连接,等再次使用时再尝试连接,这个语句就是在断开重连时做检测的。感觉意思有那么点像,就搜了下c3p0是否有类似的配置,果然找到了一个:
<property name="preferredTestQuery">
<value>SELECT 1</value>
</property>
加上该配置后,到目前为止,已经1天半了,一直没有出现问题,后续详情,有待继续观察,但是按照之前的出现概率和场景,这个时候应该是会出现死锁的,至于这个配置的原理,后续慢慢了解,等待继续更新。
附上c3p0配置项的一个帖子:
http://www.blogjava.net/ashutc/archive/2011/03/16/346365.html