在效能調優過程中,通過監控資料經常發現介面花費大量時間在獲取資料庫連線中,那如何通過優化資料庫連線池的配置來優化服務的效能呢?
建立資料庫連線是乙個很耗時的操作,也容易對資料庫造成安全隱患。所以,在程式初始化的時候,集中建立多個資料庫連線,並把他們集中管理,供程式使用,可以保證較快的資料庫讀寫速度,還更加安全可靠
官方解釋:任何資料庫的訪問都需要首先建立資料庫連線。這是乙個複雜、緩慢的處理。牽涉到通訊建立(包括 tcp 的三次握手)、認證、授權、資源的初始化和分配等一系列任務資料庫連線池(connection pooling)是程式啟動時建立足夠的資料庫連線,並將這些連線組成乙個連線池,由程式動態地對池中的連線進行申請,使用,釋放。
在應用啟動時預先建立一些資料庫連線,應用程式使用已有的連線可以極大提高響應速度。另外,web 服務應用當客戶很多時,有很多執行緒,連線數目過多以及頻繁建立/刪除連線也會影響資料庫的效能
連線池帶來的好處:
在應用開始時建立一組資料庫的連線,也可以動態建立但是復用已有的連線。這些連線被儲存到乙個共享的資源資料結構,稱為連線池(典型的生產者-消費者併發模型)
連線邏輯
每個執行緒在需要訪問資料庫時借用(borrow)乙個連線,使用完成則釋放(release)連線回到連線池供其他執行緒使用
比較好的執行緒池構件會有二個引數動態控制線程池的大小:最小數量和最大數量
最小數量指即使負載很輕,也保持乙個最小數目的資料庫連線以備不時之需
當同時訪問資料庫的執行緒數超過最小數量時,則動態建立更多連線。最大數量則是允許的最大資料庫連線數量,當最大數目的連線都在使用而有新的執行緒需要訪問資料庫時,則新的執行緒會被阻塞直到有連線被釋放回連線池
當負載變低,池裡的連線數目超過最小數目而只有低於或等於最小數目的連線被使用時,超過最小數目的連線會被關閉和刪除以便節省系統資源。
連線洩露
連線池的實際應用中,最擔心的問題就是借了不還的這種讓其他人無資源可用的人品問題
編碼邏輯錯誤或者釋放連線放**沒有放到 finally 部分都會導致連線池資源枯竭從而造成系統變慢甚至完全阻塞的情況。類似於記憶體洩露,因而也叫連線洩露
連線池只是給業務應用提供已建立的連線,所有的訪問請求都通過連線**到後台資料庫伺服器
具體來說,連線池是兩個執行緒池的中間通道。可以看成下面的結構:
上圖中,連線池和應用服務線執行緒池在同乙個程序裡面。每個訪問資料庫的應用服務程序都有自己的執行緒池和對應的資料庫連線池。資料庫伺服器可能需要處理來自乙個或多個伺服器的多個應用服務程序內的資料庫連線池資料訪問請求
程式初始化時建立連線池
使用時向連線池申請可用連線
使用完畢,將連線返還給連線池
程式退出時,斷開所有連線,並釋放資源
做為應用服務和資料庫的橋梁,連線池引數配置的目標是全域性優化。具體的優化目的有四個:
盡可能滿足應用服務的併發資料庫訪問
不讓資料庫伺服器過載
能發現用了不還造成的死鎖
不浪費系統資源
不浪費系統資源是指配置過大的連線池會浪費應用伺服器的系統資源,包括記憶體,網路埠,同步訊號等。同時執行緒池的重啟和操作都會響應變慢。不過應用端連線池的開銷不是很大,資源的浪費通常不是太大問題
初始化連線:可考慮設定為3個連線 。對於db規模特別大的情況下可考慮設定為1個。避免啟動時間過長
最小連線:可考慮該值的設定和初始化連線保持一致
最大連線:對於有較大db規模,最大連線不要設定過大,避免本地維護的db太大。如果對應到資料來源的併發數過高,可考慮增大最大連線數
獲取連線和釋放連線心跳檢測:建議全部關閉,否則每個資料庫訪問指令會對資料庫生產額外的兩條心跳檢測的指令,增加資料庫的負載。連線有效性的檢查改用後台空閒連線檢查
心跳檢查的sql語句:盡量使用ping命令,ping的效能較查詢語句高。大部分的資料庫連線池不配置query語句,便會呼叫ping命令。
preparestatement快取:可以根據自己的業務來判定是否開啟。開啟後對效能的影響依賴於具體業務和併發情況。可考慮暫時不開啟
連線使用超時:業務拿到乙個連線,如果超過指定的時間未歸還,是否把該連線給給**掉。超時時間等和具體的業務關聯。暫時建議先不開啟
druid配置
介紹:
配置說明:
minevictableidletimemillis(最大空閒時間):預設為30分鐘,配置裡面不進行設定
testonborrow ,testonreturn 預設為關閉,可以設定為不配置
testwhileidle(在獲取連線後,確定是否要進行連線空閒時間的檢查)。預設為true。配置裡面不再進行設定
流程說明:
在第一次呼叫connection的時候,才會進行 initialsize的初始化
心跳檢測時間執行緒,會休眠timebetweenevictionrunsmillis時間,然後只對(沒有borrow的執行緒 減去 minidle)的執行緒進行檢查,如果空閒時間大於minevictableidletimemillis則進行close
testwhileidle必須設定為true,在獲取到連線後,先檢查testonborrow,然後再判定testwhileidle,如果連線空閒時間大於timebetweenevictionrunsmillis,則會進行心跳檢測
不需要配置validationquery,如果不配置的情況下會走ping命令,效能更高
連線儲存在陣列裡面,獲取連線的時候,獲取陣列的最後一位。在timebetweenevictionrunsmillis時是從前往後進行檢查連線的有效性
資料庫連線池配置
連線池的必要性 資料庫連線池是負責分配 管理和釋放資料庫連線,它允許應用程式重複使用乙個現有的資料庫連線,可以視作乙個存放資料庫連線的容器。資料庫連線池採用了資源池設計模式,用於資源共享,避免資源的頻繁分配與釋放問題。同時便於統一管理,可以通過對連線池的控制,限制系統與資料庫的連線,監視資料庫的連線...
資料庫連線池技術 DBCP連線池 配置
最近遇到資料庫連線池配置問題,搜了很多資料對照著進行全域性配置都沒有解決。報的錯誤是 org.apache.tomcat.dbcp.dbcp.sqlnestedexception cannot create jdbc driver of class for connect url jdbc mysq...
MySql 資料庫連線池
1 匯入相關jar包 2 編寫c3p0 config.xml檔案 自動載入 com.mysql.jdbc.driver jdbc mysql localhost 3306 資料庫名 root 密碼 5 103000 3 測試 public class c3p0test 1 匯入jar包 2 編寫dr...