开发时用了Spring JdbcTemplate + c3p0组合,做性能测试时出现严重的性能问题。40的并发访问,开始时候系统正常,几分钟后,应用就不能访问了。停止40并发的压力,1分钟左右又可以正常访问应用程序了,log日志:

2011-11-01 13:48:39,378 [com.mchange.v2.async.ThreadPoolAsynchronousRunner:435]
-[WARN] com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@4ec5571b    -- APPARENT DEADLOCK!!!
Complete Status: [num_managed_threads: 10, num_active: 10; activeTasks: com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@7dd9d603
(com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#6),
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@68719f81 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#9),
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@7b9f03b8 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#7),

把c3p0换为DBCP后,可以正常进行性能测试,访问正常,判定c3p0存在bug。

c3p0从连接池中获取和释放连接时,采用了异步的处理方式。在调用了从c3p0获得的连接的close方法时,不是立即放回池中的,而是放入一 个事件队列中等待c3p0内部的线程池顺序的处理。

c3p0中的2个跟内部的连接池有关参数:maxAdministrativeTaskTimenumHelperThreads
官方描述在:http://www.mchange.com/projects/c3p0/index.html

maxAdministrativeTaskTime中说c3p0中的很多功能不是由 client threads完成的,是通过内部线程池完成的,如果某些内部功能“挂起”了线程池中的线程,那线程池中的线程将被耗尽,其最后结果就是c3p0停止响应了。

需要内部线程池处理的功能:

expandPool -- 在扩大池中连接的时候,如管理的连接从20扩大到40个
shrinkPool -- 在缩小连接池的时候,这个过程需要真正关闭一些连接
doCheckinManaged -- 把连接返回给连接池
checkIdleResources -- 定时检查池中的连接

“APPARENT DEADLOCK”警告就是由于c3p0内部线程池的所有线程都被挂起而造成的,因此官方文档说把numHelperThreads设置大一些可以有效避免这个警告。但是这种方法只能延缓问题的出现,并不能避免整个应用被挂起的问题。

查看log日志,会发现哪些任务的线程:

[com.mchange.v2.async.ThreadPoolAsynchronousRunner:435]-[WARN] com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@4ec5571b  -- APPARENT DEADLOCK!!! Complete Status: [num_managed_threads: 10, num_active: 10;   activeTasks:   com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@7dd9d603 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#6),   com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@68719f81 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#9),   com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@7b9f03b8 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#7),   com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@4ad6470 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#4),   com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@139cf776 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0),   com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@263a6e09 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2),   com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@460e247a (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#3),   com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@4a7ce984 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1),   com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@4ec6ff50 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#5),   com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@6aa40597 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#8);   pendingTasks:   com.mchange.v2.resourcepool.BasicResourcePool$6@366b3333,   com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@37ee752e,   com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@84f3bb2,   com.mchange.v2.resourcepool.BasicResourcePool$6@9d82761,   com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@4e015653,   com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@39ca8b27,   com.mchange.v2.resourcepool.BasicResourcePool$6@2075cb15,   com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1567e059,   com.mchange.v2.resourcepool.BasicResourcePool$6@56b9fe09,

可以看到AcquireTask占用了内部线程池的所有线程,没有线程可以来执行BasicResourcePool$6对应的任务,而这个任务的作用就是把池外使用完的连接放回池内的,c3p0被挂起了。

发生 DEADLOCK 的前提条件:

  1. 连接池会进行expandPool操作,因为这样才能产生AcquireTask对象,这个对象会阻塞内部连接池,因此,如果把minPoolSize和maxPoolSize设置为一样大可以避免这个问题
  2. AcquireTask的执行持续很长时间,要大于10秒,在实际环境中是有可能放生的
  3. acquireIncrement要大于numHelperThreads,这样才有可能把所有内部线程都占用
  4. 连接池的访问压力要很大,压力线程数要大于连接池现有的连接数

c3p0存在严重bug “APPARENT DEADLOCK“的问题相关推荐

  1. c3p0存在严重bug

    开发的系统使用了Spring JdbcTemplate + c3p0组合,在做性能测试的时候出现了严重的性能问题.40的并发访问,开始的时候系统正常,等过了几分钟后,应用程序不能访问了.停止40并发的 ...

  2. C3P0连接池问题,APPARENT DEADLOCK!!! Creating emergency..... [问题点数:20分,结帖人lovekong]...

    采用c3p0连接池,每次调试程序,第一次访问时(Tomcat服务器重启后再访问)都会出现以下错误,然后连接库需要很长时间,最终是可以连上的,之后再访问就没问题了,请高手们会诊一下,希望能帮小弟解决此问 ...

  3. c3p0 APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks

    2018-01-04 15:02:03,319 ---com.mchange.v2.async.ThreadPoolAsynchronousRunner: com.mchange.v2.async.T ...

  4. oracle怎么deadlock,APPARENT DEADLOCK!!! 错误解决过程

    项目环境 数据库:oracle 中间件:WAS 2.  问题描述 2015.05.21(是个好日子),早上发现was后台报错如下: [15-5-21 7:31:01:171 CST] 00000027 ...

  5. 警告: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@21eb3f -- APPARENT DEADLOCK!!

    警告: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@21eb3f -- APPARENT DEADLOCK!! ...

  6. 记录一个c3po连接池APPARENT DEADLOCK解决方法

    在使用c3p0数据池时,如果连接池参数配置不当,可能会引发一个意想不到的问题. 数据库:Oracle c3p0版本:0.9.5.2 数据源配置: application.xml <bean id ...

  7. APPARENT DEADLOCK Creating emergency threads for unassigned pending tasks

    项目场景: 在迁移CDH集群的元数据库后,重新启动集群,发现启动失败. APPARENT DEADLOCK!!! Creating emergency threads for unassigned p ...

  8. C3P0错误APPARENT DEADLOCK!!!解决

    在使用C3P0的过程中出现了好多错误.最长见就是死锁,占用资源比较大. 在日志中出现大量如下日志 16:18:01.294 ERROR org.hibernate.util.JDBCException ...

  9. C3P0访问数据库死锁,com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@128e59b3 -- APPARENT

    错误信息: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@128e59b3 -- APPARENT DEADLO ...

最新文章

  1. LeetCod中等题之复数乘法
  2. 智能车竞赛创意组别对应的FQA
  3. 计算用户输入的数字的平均数,并输出大于平均数的数字输出
  4. git pull代码出现refusing to merge unrelated histories错误
  5. BZOJ[1972] [Sdoi2010]猪国杀
  6. 创建调用查询删除存储过程语法
  7. 武侠乂怎么修改服务器,武侠乂怎么操作 按键功能详细介绍
  8. 【zipkin】链路追踪
  9. java 解析sh文件内容_java 文件读取
  10. Django简单介绍-基础1
  11. ECMAScript 5 —— 基本包装类型之String(下)
  12. Pycharm 简单设置成官方中文版
  13. db2 jdbc驱动参数_db2的jdbc驱动安装及例子
  14. AMR音频文件格式分析
  15. python gif转jpg_PIL-将GIF帧转换为JPG
  16. iOS-instrument使用
  17. 【Web前端】京东商城项目实战HTML+CSS+JavaScript
  18. ue4 c++绘线 DrawLine
  19. python selenium爬虫自动登录实例
  20. Java 1072 开学寄语

热门文章

  1. Ubuntu安装Go语言环境
  2. HDU1042 n!【大数+万进制】
  3. Java 经典面试题 —— 性能与安全
  4. 一题多解 —— $?(命令返回状态)的检验
  5. 数学思想 —— 简化问题
  6. 算法——从旋转字符串到翻转单词
  7. Shell 操作 —— for 循环与函数
  8. python编程是干嘛的-编程小白必看!Python到底能做什么?
  9. python为什么叫爬虫-python为什么叫网络爬虫
  10. python发音翻译-Python translate()方法