1. 程式人生 > 實用技巧 >SpringBoot工程下如何實現對HikariCP連線池的整合

SpringBoot工程下如何實現對HikariCP連線池的整合

池化思想

池化思想是我們專案開發過程中的一種非常重要的思想,如整數池,字串池,物件池、連線池、執行緒池等都是池化思想的一種應用,都是通過複用物件,以減少因建立和釋放物件所帶來的資源消耗,進而來提升系統性能。例如Integer物件的內部池應用,程式碼如下:

public class TestInteger01 {
    public static void main(String[] args) {
        Integer n1=100;//Integer.valueOf(100) 編譯時優化
        Integer n2=100;
        Integer n3=200;
        Integer n4=200;//池中沒有則new Integer(200)
        System.out.println(n1==n2);//true
        System.out.println(n3==n4);//false 
    }
    
}

資料庫連線池簡介

背景分析

目開發過程中應用程式與資料庫互動時,“獲得連線”或“釋放連線”是非常消耗系統資源的兩個過程,頻繁地進行資料庫連線的建立和關閉會極大影響系統的效能,若多執行緒併發量很大,這樣耗時的資料庫連線就可能讓系統變得卡頓。因為TCP連線的建立開支十分昂貴,並且資料庫所能承載的TCP併發連線數也有限制,針對這種場景,資料庫連線池應運而生。如下圖所示:

思考:假如現在是讓你去設計一個連線池,你會從什麼角度進行設計?
第一:物理儲存結構(基於什麼結構去儲存資料)
第二:基於什麼演算法從池中取連線?
第三:基於什麼演算法從池中移除連線?
第四:當池中沒有連線時,基於什麼方式處理連線請求?
第五:池是可以共享,我們需要考慮池在訪問的時併發安全?

連線池原理分析

在系統初始化的時候,在記憶體中開闢一片空間,將一定數量的資料庫連線作為物件儲存在物件池裡,並對外提供資料庫連線的獲取和歸還方法。使用者訪問資料庫時,並不是建立一個新的連線,而是從資料庫連線池中取出一個已有的空閒連線物件;使用完畢歸還後的連線也不會馬上關閉,而是由資料庫連線池統一管理回收,為下一次借用做好準備。如果由於高併發請求導致資料庫連線池中的連線被借用完畢,其他執行緒就會等待,直到有連線被歸還。整個過程中,連線並不會關閉,而是源源不斷地迴圈使用,有借有還。資料庫連線池還可以通過設定其引數來控制連線池中的初始連線數、連線的上下限數,以及每個連線的最大使用次數、最大空閒時間等,也可以通過其自身的管理機制來監視資料庫連線的數量、使用情況等。

Java中的連線池

Java官方,為了在應用程式中更好的應用連線池技術,定義了一套資料來源規範,例如javax.sql.DataSource介面,基於這個介面,很多團隊或個人建立了不同的連線池物件。然後我們的應用程式中通過耦合與DataSource介面,便可以方便的切換不同廠商的連線池。Java專案中通過連線池獲取連線的一個基本過程,如下圖所示:

在上圖中,使用者通過DataSource物件的getConnection()方法,獲取一個連線。假如池中有連線,則直接將連線返回給使用者。假如池中沒有連線,則會呼叫Dirver(驅動,由資料庫廠商進行實現)物件的connect方法從資料庫獲取,拿到連線以後,可以將連線在池中放一份,然後將連線返回給呼叫方。連線需求方再次需要連線時,可以從池中獲取,用完以後再還給池物件。

資料庫連線池在Java資料庫相關中介軟體產品群中,應該算是底層最基礎的一類產品,作為企業應用開發必不可少的元件,無數天才們為我們貢獻了一個又一個的優秀產品,它們有的隨時代發展,功成身退,有的則還在不斷迭代,老而彌堅,更有新生代產品,或效能無敵,或功能全面。目前市場上常見的連線池有DBCP、C3P0,DRUID,HikariCP等。

基於HikariCP實現JDBC操作(練習)

業務分析

基於HikariCP,藉助JDBC技術訪問商品庫中的資料。

API架構設計

基於業務,進行API設計,如圖所示:

業務時序圖分析

基於業務需求,進行商品查詢過程的的時序圖設計,如圖所示: