首先放出官方關於為什么將默認的連接池設置為Hikari的原因:
ConcurrentBag:更好的並發集合類實現
ConcurrentBag的實現借鑒於C#中的同名類,是一個專門為連接池設計的lock-less集合,實現了比LinkedBlockingQueue、LinkedTransferQueue更好的並發性能。ConcurrentBag內部同時使用了ThreadLocal和CopyOnWriteArrayList來存儲元素,其中CopyOnWriteArrayList是線程共享的。ConcurrentBag采用了queue-stealing的機制獲取元素:首先嘗試從ThreadLocal中獲取屬於當前線程的元素來避免鎖競爭,如果沒有可用元素則再次從共享的CopyOnWriteArrayList中獲取。此外,ThreadLocal和CopyOnWriteArrayList在ConcurrentBag中都是成員變量,線程間不共享,避免了偽共享(false sharing)的發生。
使用FastList替代ArrayList
FastList是一個List接口的精簡實現,只實現了接口中必要的幾個方法。JDK ArrayList每次調用get()方法時都會進行rangeCheck檢查索引是否越界,FastList的實現中去除了這一檢查,只要保證索引合法那么rangeCheck就成為了不必要的計算開銷(當然開銷極小)。此外,HikariCP使用List來保存打開的Statement,當Statement關閉或Connection關閉時需要將對應的Statement從List中移除。通常情況下,同一個Connection創建了多個Statement時,后打開的Statement會先關閉。ArrayList的remove(Object)方法是從頭開始遍歷數組,而FastList是從數組的尾部開始遍歷,因此更為高效。
相比Druid:druid有阿里大數據量的驗證,但是HikariCP沒有經過這么大數據量的測試。
關於springboot項目中對Hikari的配置
springboot 2.0 默認連接池就是Hikari了,所以引用parents后不用專門加依賴