(已解決)C3P0數據庫使用配置文件鏈接,報錯:com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run


本帖簡單來說,注意配置的xml文件中的“&”的寫法,改成xml文件中支持的“&”即可解決問題。

其他類型的錯誤排查及排查步驟見下方

因為hibernate和spring等開源框架均使用C3P0來做來創建和管理連接。所以打算自己來體驗一下C3P創建的具體過程,在使用C3P0指定的配置文件來創建連接執行簡單操作測試時,出現了以下的錯誤:

四月 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

 

本篇博客針對的是配置文件導致的錯誤,與配置多數據源、嵌套資源釋放等問題無關。

在出現上述問題后,進行了問題的逐一排查,下面是關於這個問題的排查與更改步驟:

 

一  。先排查上述報錯中能自己修改的部分,比如第三段報錯中關於maxStatements的value的設置

image

這種書寫方式不能不被承認,因為是從網上找來的書寫方式(第5條),與默認的書寫方式不同(前4條)所以與上面對齊,統一將值直接寫在標簽內部

image

 

二  。我們再來排查第二段報錯中的描述無法找到合適的驅動

這里先埋下伏筆,我們一般自己書寫配置文件驅動路徑的方式是:

image

在DBCP池中是這樣的:

image

在C3P0中是這樣的:

image

但是在C3P0中如果連接mysql80所需要添加的3個參數,你按照往常使用&符號去連接他們,那么你會得到報錯:

[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內容已修改

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM