和很多网友一样,碰到了死锁的这个问题,信息类似如下:
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
另外,在配置连接池单例时,在多线程获取连接时,也容易出现获取连接超时的问题,你可以需要按照下面这样修改代码:
- public <span style="color:#ff0000;">synchronized</span> final Connection getConnection() {
- try {
- return ds.getConnection();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return null;
- }