關於tomcat連線池爆滿導致系統崩潰的問題

NO IMAGE

最近,在專案組遇到了tomcat連線池資源不釋放,導致系統崩潰的問題。經過好幾個小時的排查,最終確定應該是由於事務控制機制不完善導致的。

首先呢,在日常程式碼的編寫過程中一定要注意規範性,尤其是ssh架構的系統當中。該在service層呼叫的程式碼就不要再action中去呼叫,該在service層加事務控制就一定不要忘記。凡是涉及到資料庫的操作,都應當加上事務,防止遺漏。

其次,在使用tomcat資料庫連線池時,應當加入以下幾個引數定時去回收釋放時間超時的連線資源。

  1. initialSize :連線池啟動時建立的初始化連線數量(預設值為0)
  2. maxActive :連線池中可同時連線的最大的連線數(預設值為8,調整為20,高峰單機器在20併發左右,自己根據應用場景定)
  3. maxIdle:連線池中最大的空閒的連線數,超過的空閒連線將被釋放,如果設定為負數表示不限制(預設為8個,maxIdle不能設定太小,因為假如在高負載的情況下,連線的開啟時間比關閉的時間快,會引起連線池中idle的個數 上升超過maxIdle,而造成頻繁的連線銷燬和建立,類似於jvm引數中的Xmx設定)
  4. minIdle:連線池中最小的空閒的連線數,低於這個數量會被建立新的連線(預設為0,調整為5,該引數越接近maxIdle,效能越好,因為連線的建立和銷燬,都是需要消耗資源的;但是不能太大,因為在機器很空閒的時候,也會建立低於minidle個數的連線,類似於jvm引數中的Xmn設定)
  5. maxWait  :最大等待時間,當沒有可用連線時,連線池等待連線釋放的最大時間,超過該時間限制會丟擲異常,如果設定-1表示無限等待(預設為無限,調整為60000ms,避免因執行緒池不夠用,而導致請求被無限制掛起)
  6. poolPreparedStatements:開啟池的prepared(預設是false,未調整,經過測試,開啟後的效能沒有關閉的好。)
  7. maxOpenPreparedStatements:開啟池的prepared 後的同時最大連線數(預設無限制,同上,未配置)
  8. minEvictableIdleTimeMillis  :連線池中連線,在時間段內一直空閒, 被逐出連線池的時間
  9. (預設為30分鐘,可以適當做調整,需要和後端服務端的策略配置相關)
  10. removeAbandonedTimeout  :超過時間限制,回收沒有用(廢棄)的連線(預設為 300秒,調整為180)
  11. removeAbandoned  :超過removeAbandonedTimeout時間後,是否進 行沒用連線(廢棄)的回收(預設為false,調整為true)

以上引數主要是為了解決事務控制沒有加或者資料庫存在死鎖情況。

本文僅為個人做筆記,有興趣的或者遇到問題的可以看看。如有不同意見或看法,還望保留,謝謝!