博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c3p0 APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks
阅读量:6796 次
发布时间:2019-06-26

本文共 2034 字,大约阅读时间需要 6 分钟。

2018-01-04 15:02:03,319 ---com.mchange.v2.async.ThreadPoolAsynchronousRunner: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@4d6c4ebb -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!

先说说APPARENT DEADLOCK!!!​什么情况下会抛出这样的异常?

通过看源码,源码是个好东西,有个检测死锁的DeadlockDetector​,每隔一段时间就会检测一次,是一个TimerTask,里面是这样写的:

current = (LinkedList) pendingTasks.clone();​

if ( current.equals( last ) ){

               logger.warning(this + " -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!");

}​

解释一下current和last

代码里这两个对象分别是一个LinkedList

current用来记录当前等待获取连接的AcquireTask​

last用来记录上次等待获取连接的AcquireTask​

如果二者相等的话,C3P0认为是死锁,抛出警告

什么情况下会出现这样的异常?

1.数据库连接不上的话,会报这样的异常​,检查数据源配置是否正确?

我在本地测试,没有配置​checkoutTime(获取连接的超时时间)这个参数,20根线程并发发起连接,检测死锁的线程的线程,试想,在某次检测过程中发现18个等待连接的任务,那么在下一次检测的时候,这18个连接任务,仍旧没有连上数据库,可能是数据库连接配置错误,检查数据源配置信息,满足出这个错误的条件,当然就会报APPARENT DEADLOCK!!!

2.在缓存中存在Statement,来说说这个

网上有人回答这个问题,说是设置c3p0.maxStatements=0,为啥设置一下这个就OK了呢?

这里说说我个人思考,因为在数据库里的Statement的缓存都是在连接基础上了,存在缓存了,这里我理解就是就是占用了数据库的连接数,而申请新的连接的过程中,在达到连接数​最大时,检测死锁的线程又可能会检测出2次等待连接是AcquireTask相等,就会抛出异常。

My workaround: 

In hibernate.cfg.xml: 

Code:
<property name="hibernate.c3p0.max_statements">0</property>

In c3p0.properties:

Code:
c3p0.maxStatements=0
c3p0.maxStatementsPerConnection=100

For such setting my multithreaded applications runs with no APPARENT DEADLOCK error (finally and ... hopefully that this problem is really solved). 

My app running quite fast so I guess (and I believe) that Statement caching is working. Statements caching is crucial for me because of performance. In other words I couldn't just turn Statement caching off (*). 
As far as I can see turning Statement caching off (this global statement caching) is one (or maybe the only one) solution to get rid of APPARENT DEADLOCK errors. 
Damn, I really would like to have time to have a look at c3p0 source code and figure out where is the reason of those fu!@#$% errors (Oracle JDBC or Hibernate or c3p0). 

总结一下:就是用户申请新的连接的时候,旧的连接又没有及时释放,那么就会抛出​APPARENT DEADLOCK!!!的异常了。

本文转自:

转载地址:http://lasgo.baihongyu.com/

你可能感兴趣的文章
《关于晋升》
查看>>
HDU 1176
查看>>
javascript基础——图片切换以及模拟短信发送
查看>>
vue webpack build时关闭debug和console
查看>>
Python 单例模式
查看>>
c#用UpdatePanel实现接局部刷新
查看>>
(原创)OpenStack服务如何使用Keystone(一)---Keystone端的操作
查看>>
(29)网络编程之TCP通信协议
查看>>
【转】发布python的包至pypi服务器
查看>>
grafana使用详解--技术流ken
查看>>
ajax 基础2
查看>>
树链剖分讲解及总结(重链剖分+长链剖分)
查看>>
快速沃尔什变换(FWT)及K进制异或卷积&快速子集变换(FST)讲解
查看>>
redis的主从复制和哨兵支持的主从切换
查看>>
jQuery animate() - 使用相对值 在值的前面加上 += 或 -=
查看>>
xlutils模块使用
查看>>
ARDUINO PWM
查看>>
java工程打成jar包 - 使用maven assembly插件打包及手动打包
查看>>
appche配置访问限制
查看>>
使用Python操作excel文件
查看>>