(已解决)C3P0数据库使用配置文件连接,报错:com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run

本帖简单来讲,注意配置的xml文件中的“&”的写法,改为xml文件中支持的“&”便可解决问题。php

其余类型的错误排查及排查步骤见下方java

由于hibernate和spring等开源框架均使用C3P0来作来建立和管理链接。因此打算本身来体验一下C3P建立的具体过程,在使用C3P0指定的配置文件来建立链接执行简单操做测试时,出现了如下的错误:mysql

四月 11, 2019 8:51:04 上午 com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run 警告: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@204f0fe6 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! 四月 11, 2019 8:51:04 上午 com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run 警告: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@204f0fe6 -- APPARENT DEADLOCK!!! Complete Status: ... 四月 11, 2019 8:51:13 上午 com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask run 警告: com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@6fb5efa4 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30). Last acquisition attempt exception: java.sql.SQLException: No suitable driver ... 四月 11, 2019 8:51:13 上午 com.mchange.v2.c3p0.cfg.C3P0Config initializeIntPropertyVar 信息: '' is not a legal value for property 'maxStatements'. Using default value: 0

 

本篇博客针对的是配置文件致使的错误,与配置多数据源、嵌套资源释放等问题无关。spring

在出现上述问题后,进行了问题的逐一排查,下面是关于这个问题的排查与更改步骤:sql

 

一  。先排查上述报错中能本身修改的部分,好比第三段报错中关于maxStatements的value的设置

image

这种书写方式不能不被认可,由于是从网上找来的书写方式(第5条),与默认的书写方式不一样(前4条)因此与上面对齐,统一将值直接写在标签内部数据库

image

 

二  。咱们再来排查第二段报错中的描述没法找到合适的驱动

这里先埋下伏笔,咱们通常本身书写配置文件驱动路径的方式是:app

image

在DBCP池中是这样的:框架

image

在C3P0中是这样的:eclipse

image

可是在C3P0中若是链接mysql80所须要添加的3个参数,你按照往常使用&符号去链接他们,那么你会获得报错:async

[Fatal Error] :5:108: 对实体 "serverTimezone" 的引用必须以 ';' 分隔符结尾。 四月 11, 2019 9:29:24 上午 com.mchange.v2.c3p0.cfg.C3P0Config <clinit> 警告: XML configuration disabled! Verify that standard XML libs are available. org.xml.sax.SAXParseException; lineNumber: 5; columnNumber: 108; 对实体 "serverTimezone" 的引用必须以 ';' 分隔符结尾。

这里就是一个伏笔,由于jee也是这么提示咱们的:

image

因此修改成:

image

如今报错消失了,但伏笔已经埋下了。。。

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

2019.6.6更新

之前不懂事儿,这个不是伏笔,虽然按这篇文章的方式可以解决问题,也就是手动增长配置代码,去设置JdbcUrl,但这种方式虽然解决了问题,但与配置文件的方式背道而驰,不易维护。

其本质是xml中“&”的书写问题...

这是在我使用hibernate配置文件时,配置url看到别人莫名其妙在配置mysql80url时在后面写成了

jdbc:mysql://localhost:3306/hibernate?serverTimezone=GMT&amp;useSSL=false&amp;allowPublicKeyRetrieval=true

这种形式,因而询问别人“&amp;”是什么意思,告知我是xml文件中“&”的写法???因而想起来这篇文章,回来试验了一下,发现解决了问题???

因此当eclipse在xml文件中提示你输入“;”时,请使用正确的链接“&”在xml中格式的“&amp;”便可解决问题。

在此使用纯配置文件的方式便可进行数据库管理,方便多数据源的配置,减小持久化层的修改。

能够搜索一下xml中的一些转义符多了解一下。

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 

三  。而后首先检查数据库的服务是否已经启动

image

 

四  。不使用配置文件方式使用数据池,看是否正常?

image

测试:

image

执行成功了,在使用非配置方式来获取链接,居然就成功了?

 

五  。将不使用配置成功得到的信息与使用配置失败报错的信息进行对比

image

发现除了jdbcUrl后面的路径并无什么不一样?(可能就是由于那个第二章提到的断开的 ;?)

又发现了报错:

Caused by: com.mysql.cj.exceptions.WrongArgumentException: Malformed database URL, failed to parse the connection string near '=UTC;useSSL=false'.

这个时候若是你的解决思路和我昨晚同样,使用value值把这一段可能会出问题的jdbcUrl传进去,你的问题会更严重,我在测试后发现,信息里你jdbcUrl的默认值会直接为空,这个问题在第一个大标题下已经解决了,再也不赘述,是自己xml配置文件的识别问题。

因此,给出以下针对mysql80路径的解决方式,就是常规使用配置文件进行自动配置,可是,若是出现问题,手动增长配置代码,去设置JdbcUrl

image

结果:

image

执行成功了,mysql80使用须要配置的这3个参数引起过不少问题,要么不更新使用高版本,要么更换数据库,要么就慢慢排查错误。

 

网上关于C3P0死锁的解释,关于设置maxstatements在网站中有C3P0开发者本身的一段描述:

https://forum.hibernate.org/viewtopic.php?t=947246&highlight=apparent+deadlock+c3p0

image

这个swaldman(C3P0开发者),你们能够去这个网站上搜索一下他的发言,来对照一下本身的问题。

 

2019.6.6内容已修改

修改部分在<<<<<<内容>>>>>>中