什么是數(shù)據(jù)庫連接池:
連接池是一種常用的技術(shù),為什么需要連接池呢?這個(gè)需要從TCP說起。假如我們的服務(wù)器跟數(shù)據(jù)庫沒有部署在同一臺(tái)機(jī)器,那么,服務(wù)器每次查詢數(shù)據(jù)庫都要先建立連接,一般都是TCP鏈接,建立連接就需要3次握手了,假設(shè)后臺(tái)服務(wù)跟數(shù)據(jù)庫的單程的訪問時(shí)間需要10ms,那么光是建立連接就花了30ms,并且TCP還有慢啟動(dòng)的機(jī)制,實(shí)際上一次查詢可能還不止1次TCP來回,查詢效率就會(huì)大大降低。
為什么需要連接池:
為了解決上述問題,我們就需要維護(hù)一些長鏈接,這樣就不用每次都去建立連接,畢竟建立連接除了占用時(shí)間,還需要一些其他的系統(tǒng)資源。另外的好處,連接池讓我們更加容易地管理,一方面是可以避免數(shù)據(jù)庫資源都被某幾個(gè)API占據(jù),另一方面也可以避免資源泄露。
什么是HikariCP
HikariCP是由在日本生活的美國人程序員開源的一個(gè)數(shù)據(jù)庫連接池組件,代碼非常輕量,并且速度非常的快。根據(jù)官方提供的數(shù)據(jù),在i7,開啟32個(gè)線程32個(gè)連接的情況下,進(jìn)行隨機(jī)數(shù)據(jù)庫讀寫操作,HikariCP的速度是現(xiàn)在常用的C3P0數(shù)據(jù)庫連接池的數(shù)百倍。在SpringBoot2.0中,官方也是推薦使用HikariCP。
為什么HikariCP會(huì)那么快
1.字節(jié)碼更加精簡,所以可以加載更多代碼到緩存。
2.實(shí)現(xiàn)了一個(gè)無鎖的集合類型,來減少并發(fā)造成的資源競(jìng)爭(zhēng)。
3.使用了自定義的數(shù)組類型,相對(duì)與ArrayList極大地提升了性能。
4.針對(duì)CPU的時(shí)間片算法進(jìn)行優(yōu)化,盡可能在一個(gè)時(shí)間片里面完成各種操作。
與Druid對(duì)比
在github上有網(wǎng)友貼出了阿里巴巴Druid與hikari的對(duì)比,認(rèn)為hikari在性能上是完全秒殺阿里巴巴的Druid連接池的。對(duì)此,阿里的工程師也做了一定的回應(yīng),說Druid的性能稍微差點(diǎn)是鎖機(jī)制的不同,并且Druid提供了更豐富的功能,兩者的側(cè)重點(diǎn)不一樣。
如何選擇:
選擇哪一款就見仁見智了,不過兩款都是開源產(chǎn)品,阿里的Druid有中文的開源社區(qū),交流起來更加方便,并且經(jīng)過阿里多個(gè)系統(tǒng)的實(shí)驗(yàn),想必也是非常的穩(wěn)定,而Hikari是SpringBoot2.0默認(rèn)的連接池,全世界使用范圍也非常廣,對(duì)于大部分業(yè)務(wù)來說,使用哪一款都是差不多的,畢竟性能瓶頸一般都不在連接池。大家可根據(jù)自己的喜好自由選擇。