本帖簡單來說,注意配置的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的設置
這種書寫方式不能不被承認,因為是從網上找來的書寫方式(第5條),與默認的書寫方式不同(前4條)所以與上面對齊,統一將值直接寫在標簽內部
二 。我們再來排查第二段報錯中的描述無法找到合適的驅動
這里先埋下伏筆,我們一般自己書寫配置文件驅動路徑的方式是:
在DBCP池中是這樣的:
在C3P0中是這樣的:
但是在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也是這么提示我們的:
所以修改為:
現在報錯消失了,但伏筆已經埋下了。。。
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
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內容已修改
修改部分在<<<<<<內容>>>>>>中













