本帖簡單來講,注意配置的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的設置
這種書寫方式不能不被認可,由於是從網上找來的書寫方式(第5條),與默認的書寫方式不一樣(前4條)因此與上面對齊,統一將值直接寫在標籤內部數據庫
二 。咱們再來排查第二段報錯中的描述沒法找到合適的驅動
這裏先埋下伏筆,咱們通常本身書寫配置文件驅動路徑的方式是:app
在DBCP池中是這樣的:框架
在C3P0中是這樣的:eclipse
可是在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也是這麼提示咱們的:
因此修改成:
如今報錯消失了,但伏筆已經埋下了。。。
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
2019.6.6更新
之前不懂事兒,這個不是伏筆,雖然按這篇文章的方式可以解決問題,也就是手動增長配置代碼,去設置JdbcUrl,但這種方式雖然解決了問題,但與配置文件的方式背道而馳,不易維護。
其本質是xml中「&」的書寫問題...
這是在我使用hibernate配置文件時,配置url看到別人莫名其妙在配置mysql80url時在後面寫成了
jdbc:mysql://localhost:3306/hibernate?serverTimezone=GMT&useSSL=false&allowPublicKeyRetrieval=true
這種形式,因而詢問別人「&」是什麼意思,告知我是xml文件中「&」的寫法???因而想起來這篇文章,回來試驗了一下,發現解決了問題???
因此當eclipse在xml文件中提示你輸入「;」時,請使用正確的鏈接「&」在xml中格式的「&」便可解決問題。
在此使用純配置文件的方式便可進行數據庫管理,方便多數據源的配置,減小持久化層的修改。
能夠搜索一下xml中的一些轉義符多瞭解一下。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
三 。而後首先檢查數據庫的服務是否已經啓動
四 。不使用配置文件方式使用數據池,看是否正常?
測試:
執行成功了,在使用非配置方式來獲取鏈接,居然就成功了?
五 。將不使用配置成功得到的信息與使用配置失敗報錯的信息進行對比
發現除了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
結果:
執行成功了,mysql80使用須要配置的這3個參數引起過不少問題,要麼不更新使用高版本,要麼更換數據庫,要麼就慢慢排查錯誤。
網上關於C3P0死鎖的解釋,關於設置maxstatements在網站中有C3P0開發者本身的一段描述:
https://forum.hibernate.org/viewtopic.php?t=947246&highlight=apparent+deadlock+c3p0
這個swaldman(C3P0開發者),你們能夠去這個網站上搜索一下他的發言,來對照一下本身的問題。
2019.6.6內容已修改
修改部分在<<<<<<內容>>>>>>中