(已解決)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內容已修改

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

相關文章
相關標籤/搜索