Spring+Mybatis+BoneCP向資料庫發出請求時出現:Io 異常: Socket read timed out
小弟使用的是bonecp管理資料庫連線,資料庫採用oracle。在執行時,如果使用了3個以上的session連線,就會出現如下錯誤。
Io 異常: Socket read timed out
每次session之後,也進行了關閉,但是還是出現這個問題。但是重啟Tomcat之後,可以正常發出請求,並且能得到正常結果。但是過了一段時間之後,Io異常又出現,如此往復。
試了各種辦法,比如設定超時時間,在oracle資料庫端配置最大連線數,設定Mybatis資料庫池的連線數,發現都沒有用。後來看了下BoneCP連線池配置引數,發現以下兩處地方設定的有問題【回收與檢測空閒連線時間設定的太大了
<!-- 設定connection的空閒存活時間。這個引數預設為60,單位:分鐘。設定為0該功能失效。 通過ConnectionTesterThread觀察每個分割槽中的connection,如果這個connection距離最後使用的時間大於這個引數就會被清除。 注意:這個引數僅和idleConnectionTestPeriodInSeconds搭配使用,而且不要在這裡設定任何挑釁的引數! -->
<!-- 1小時回收空閒連結 -->
db.idleMaxAgeInMinutes=60
<!-- 設定測試connection的間隔時間。這個引數預設為240*60,單位:分鐘。設定為0該功能失效。 通過ConnectionTesterThread觀察每個分割槽中的connection,如果這個connection距離最後使用的時間大於這個引數並且距離上一次測試的時間大於這個引數就會向資料庫傳送一條測試語句,如果執行失敗則將這個connection清除。注意:這個值僅和idleMaxAge搭配使用,而且不要在這裡設定任何挑釁的引數! -->
<!-- 4小時檢測一次空閒連結 -->
db.idleConnectionTestPeriodInMinutes=240
於是改為:
db.idleMaxAgeInMinutes=1
db.idleConnectionTestPeriodInMinutes=10
問題解決。
對於使用DBCP,C3P0, proxool資料庫連線池的朋友,可以調整下config檔案裡的最大連線數,空閒連接回收時間以及檢測時間。防止資料庫連線池被爆。相信會有不錯的效果。
附上
BoneCP連線池配置引數詳細說明
點選開啟連結引數 | 意義 | 說明 | |
一 BoneCP主要配置引數 | |||
1 | jdbcUrl | 設定資料庫URL | |
2 | username | 設定資料庫使用者名稱 | |
3 | password | 設定資料庫密碼 | |
4 | partitionCount | 設定分割槽個數。這個引數預設為1,建議3-4(根據特定應用程式而定)。 | 為了減少鎖競爭和改善效能,從當前執行緒分割槽(thread-affinity)中獲取一個connection,也就是這個樣子:partitions[Thread.currentThread().getId() % partitionCount]。當擁有充足的短期(short-lived)的執行緒時候,這個引數設定越大,效能越好。當超過一定的閥值時,連線池的維護工作就可能對效能造成一定的負面影響(僅當分割槽上的connection使用耗盡時)。 |
5 | maxConnectionsPerPartition | 設定每個分割槽含有connection最大個數。這個引數預設為2。如果小於2,BoneCP將設定為50。 | 比如:partitionCount設定為3,maxConnectionPerPartition設定為5,你就會擁有總共15個connection。注意:BoneCP不會將這些connection一起創建出來,而是說在需要更多connection的時候從minConnectionsPerPartition引數開始逐步地增長connection數 |
6 | minConnectionsPerPartition | 設定每個分割槽含有connection最小個數。這個引數預設為0。 | |
7 | acquireIncrement | 設定分割槽中的connection增長數量。這個引數預設為1。 | 當每個分割槽中的connection大約快用完時,BoneCP動態批量建立connection,這個屬性控制一起建立多少個connection(不會大於maxConnectionsPerPartition). |
8 | poolAvailabilityThreshold | 設定連線池閥值。這個引數預設為20%。如果小於0或是大於100,BoneCP將設定為20。 | 連線池觀察執行緒(PoolWatchThread)試圖為每個分割槽維護一定數量的可用connection。 |
9 |
| 設定獲取connection超時的時間。這個引數預設為Long.MAX_VALUE;單位:毫秒。 | 在呼叫getConnection獲取connection時,獲取時間超過了這個引數,就視為超時並報異常。 |
二 BoneCP執行緒配置引數 | |||
1 | releaseHelperThreads --0.8版中已不建議使用。 | 設定connection助手執行緒個數。這個引數預設為3。如果小於0,BoneCP將設定為3。 | 設定為0時,應用程式執行緒被阻塞,直到連線池執行必要地清除和回收connection,並使connection在其它執行緒可用。 |
2 | statementReleaseHelperThreads | 設定statement助手執行緒個數。這個引數預設為3。如果小於0,BoneCP將設定為3。 | 設定為0時,應用程式執行緒被阻塞,直到連線池或JDBC驅動程式關閉statement。 |
3 | maxConnectionAge | 設定connection的存活時間。這個引數預設為0,單位:毫秒。設定為0該功能失效。 | 通過ConnectionMaxAgeThread觀察每個分割槽中的connection,不管connection是否空閒,如果這個connection距離建立的時間大於這個引數就會被清除。當前正在使用的connection不受影響,直到返回到連線池再做處理。 |
4 |
idleMaxAgeInMinutes | 設定connection的空閒存活時間。這個引數預設為60,單位:分鐘。設定為0該功能失效。 | 通過ConnectionTesterThread觀察每個分割槽中的connection,如果這個connection距離最後使用的時間大於這個引數就會被清除。注意:這個引數僅和idleConnectionTestPeriod搭配使用 |
5 |
| 設定測試connection的間隔時間。這個引數預設為240,單位:分鐘。設定為0該功能失效。 | 通過ConnectionTesterThread觀察每個分割槽中的connection, 如果這個connection距離最後使用的時間大於這個引數並且距離上一次測試的時間大於這個引數就會向資料庫傳送一條測試語句,如果執行失敗則將這個connection清除。 注意:這個值僅和idleMaxAge搭配使用,引數要適當! |
三 BoneCP其他可選配置引數 | |||
1 | acquireRetryAttempts | 設定重新獲取連線的次數。這個引數預設為5。 | 獲取某個connection失敗之後會多次嘗試重新連線,如果在這幾次還是失敗則放棄。 |
2 | acquireRetryDelay | 設定重新獲取連線的次數間隔時間。這個引數預設為7000,單位:毫秒。如果小於等於0,BoneCP將設定為1000。 | 獲取connection失敗之後再次嘗試獲取connection的間隔時間。 |
3 | lazyInit | 設定連線池初始化功能。這個引數預設為false。 | 設定為true,連線池將會初始化為空,直到獲取第一個connection。 |
4 | statementsCacheSize | 設定statement快取個數。這個引數預設為0。 | |
5 | disableJMX | 設定是否關閉JMX功能。這個引數預設為false。 | |
6 | poolName | 設定連線池名字。用於當作JMX和助手執行緒名字的字尾。 | |
四 BoneCP除錯配置引數 | |||
1 | closeConnectionWatch | 設定是開啟connection關閉情況監視器功能。這個引數預設為false。 | 每當呼叫getConnection()時,都會建立CloseThreadMonitor,監視connection有沒有關閉或是關閉了兩次。警告:這個引數對連線池效能有很大的負面影響,慎用!僅在除錯階段使用! |
2 | closeConnectionWatchTimeout | 設定關閉connection監視器(CloseThreadMonitor)持續多長時間。這個引數預設為0;單位:毫秒。 | 僅當closeConnectionWatch引數設定為可用時,設定這個引數才會起作用。 |
3 | logStatementsEnabled | 設定是否開啟記錄SQL語句功能。這個引數預設是false。 | 將執行的SQL記錄到日誌裡面(包括引數值)。除錯階段會很有用. |
4 | queryExecuteTimeLimit | 設定執行SQL的超時時間。這個引數預設為0;單位:毫秒。 | 當查詢語句執行的時間超過這個引數,執行的情況就會被記錄到日誌中。 |
5 | disableConnectionTracking | 設定是否關閉connection跟蹤功能。這個引數預設為false。 | 設定為true,連線池則不會監控connection是否嚴格的關閉;設定為false,則啟用跟蹤功能(僅追蹤通過Spring或一些事務管理等機制確保正確釋放connection並放回到連線池中)。 |
6 | transactionRecoveryEnabled | 設定事務回放功能。這個引數預設為false。 | 設定為true時,MemorizeTransactionProxy可以記錄所有在connection上操作的情況,當connetion操作失敗的時候會自動回放先前的操作,如果在回放期間還是失敗,則丟擲異常。注意:這個功能會使連線池微弱地降低執行速度。 |