记一次:c3p0连接池死锁的问题

       在公司的项目开发中,我负责数据层接口的代码编写工作,其中,就涉及到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

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

      

	public synchronized final Connection getConnection() {
        	try {
            		return ds.getConnection();
        	} catch (SQLException e) {
            		e.printStackTrace();
        	}
        	return null;
    	}



你可能感兴趣的:(mysql)