連線池中連線失效,mysql死鎖
mysqs資料庫,連線池為dbcp、druid,出現問題:
1、The last packet successfully received from the server was 915,358 millisecon····
2、holder is null····
解決方法: 1、tomcat配置檔案server.xml中,對外開放的埠配置中(<Connector ... />)加上minSpareThreads=“0”;表示Tomcat初始化時建立的執行緒數,因為我們從連線池中獲取到的連線為失效的連線,mysql預設保持連線的有效時間為8小時,當從資料庫中獲取到連線,且超過8小時未使用時,就會報上面的錯誤。所以可以讓tomcat啟動時建立的初始執行緒數為0,避免執行緒等待,導致資料庫連線等待時間超過8小時後出現上面的錯誤。(該方法降低了tomcat使用效能,好像也不能完全解決問題)。
2、有的時候,即使配置了以下內容,還是會出現holder is null問題(druid):
<!-- 配置間隔10分鐘才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="600000" />
<!-- 配置一個連線在池中最小生存的時間,單位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="1800000" />
<property
name="validationQuery"
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="true" />
<property name="testOnReturn" value="true" />
此時,根據druid的sql監控日誌可以發現,邏輯連線開啟次數和邏輯連線關閉次數不想到,關閉次數小於開啟次數,說明有的連線沒有關閉,我們的連線都是交給spring來管理的,不好發現是哪兒沒有關閉或者歸還連線,所以用以下配置,來強制關閉連線:
<!-- 關閉長時間不使用的連線,防止連線池洩漏 -->
<property name="removeAbandoned" value="true" />
<!-- 開啟removeAbandoned功能 -->
<property name="removeAbandonedTimeout" value="1800" /> <!-- 1800秒,也就是30分鐘 -->
以上都配置了,該問題應該能解決。
相關問題:
使用程式設計式事物的時候,也有可能由於資料庫連線丟失,導致出現了死鎖問題,可以在catch語句塊的後面,加上finally,在finally裡面判斷是否的狀態是否已經提交或者回滾,假如沒有,則在finally裡將事物回滾,並列印或記錄日誌。
finally {
if (!status.isCompleted())
transactionManager.rollback(status);
}
finally語句很有必要。
程式設計式事物還需要注意一點:對同一個表有多次DML語句的時候,需要將這些操作放在同一個事物裡面,否則會出現死鎖問題(多執行緒測試後的結果)。
或者使用註解式事物,應該就能避免以上出現的這些死鎖問題。