CP30数据连接池死锁

在公司的项目开发中,我负责数据层接口的代码编写工作,其中,就涉及到mysql数据库的查询接口。为提供性能,也使用了C3P0这个连接池技术。配置简单,也好用。这里说一下,我们的使用环境;由于是给中间件层使用,而中间件并没有向web层那样,有配置spring和hibernate,因此,这些查询接口只是使用了c3p0来管理数据库连接。

       和很多网友一样,碰到了死锁的这个问题,信息类似如下:

       WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@4b9cafa7 -- APPARENT DEADLOCK!!! Complete Status:
          Managed Threads: 3
          Active Threads: 3

        通过中间件的日志发现:中间件多个应用在同时启动时,肯定报这个警告;有两台服务器在凌晨4点左右,几乎同时报这个警告。奇怪的是,貌似业务没有受到影响。之后,在网上查找了很多资料和博客,貌似没用。这里想说的是,解决问题还是要从自身的应用环境出发;在进行测试时,尽量模拟真实的环境,不要只是能用就行。

        既然,中间件多个应用在同时启动时,肯定报这个警告,那就模拟一下。在eclipse中,同时启动三个同一个测试用例(三个不同的进程);果然,三个测试用例都报了这个警告。为什么呢?因为中间件使用的是,我提供的接口,自然C3P0的配置文件也是一样的;如果说,这里边有什么冲突的话,那就是这些数据源的名称是相同了。修改后,在数据源的名称后面加上一些随机字符,再次进行测试,启动就没有报这个错误了。再在中间件的服务器上进行测试,启动没有报这个警告了。

        一些网友,也提到C3P0在配置多数据源时,容易出现死锁的问题,下面给出一个博客链接:http://www.2cto.com/database/201411/349966.html

       另外,在配置连接池单例时,在多线程获取连接时,也容易出现获取连接超时的问题,你可以需要按照下面这样修改代码:

      

  1. public <span style="color:#ff0000;">synchronized</span> final Connection getConnection() {  
  2.         try {  
  3.                 return ds.getConnection();  
  4.         } catch (SQLException e) {  
  5.                 e.printStackTrace();  
  6.         }  
  7.         return null;  
  8.     }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值