大人,時代變了,不要再用老一代的數據庫連接池啦(HicariCP)

數據庫連接池

數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重複使用一個現有的數據庫連接,而不是再重新建立一個;釋放空閒時間超過最大空閒時間的數據庫連接來避免因爲沒有釋放數據庫連接而引起的數據庫連接遺漏。這項技術能明顯提高對數據庫操作的性能。

數據庫連接池的原理

連接池基本的思想是在系統初始化的時候,將數據庫連接作爲對象存儲在內存中,當用戶需要訪問數據庫時,並非建立一個新的連接,而是從連接池中取出一個已建立的空閒連接對象。使用完畢後,用戶也並非將連接關閉,而是將連接放回連接池中,以供下一個請求訪問使用。而連接的建立、斷開都由連接池自身來管理。同時,還可以通過設置連接池的參數來控制連接池中的初始連接數、連接的上下限數以及每個連接的最大使用次數、最大空閒時間等等。也可以通過其自身的管理機制來監視數據庫連接的數量、使用情況等

Java常見的數據庫連接池

C3P0

優點:功能簡單易用,穩定性好
缺點:性能很差,架構設計過於複雜

DBCP

優點:生態圈中的影響裏十分廣泛,例如Tomcat就在內部集成了DBCP,實現JPA規範的OpenJPA,也是默認集成DBCP
缺點:核心功能依賴於Commons中的另一個子項目Pool,所以因爲pool的更新緩慢,導致DBCP更新緩慢

HikariCP

優點:性能好,並且穩定性也不差,自身小巧

Druid

優點:國內開源軟件中文文檔全,功能全面除了提供性能卓越的連接池功能外,還集成了SQL監控,黑名單攔截等功能

詳細介紹HikariCP這麼快

1.爲什麼HikariCP這麼快
  • 字節碼精簡:優化代碼,直到編譯後的字節碼最少,這樣,CPU緩存可以加載更多的程序代碼;
  • 優化代理和攔截器:減少代碼,例如HikariCP的Statement proxy只有100行代碼,只有BoneCP的十分之一;
  • 自定義數組類型(FastStatementList)代替ArrayList:避免每次get()調用都要進行range check,避免調用remove()時的從頭到尾的掃描;
  • 自定義集合類型(ConcurrentBag):提高併發讀寫的效率;
  • 其他針對BoneCP缺陷的優化,比如對於耗時超過一個CPU時間片的方法調用的研究(但沒說具體怎麼優化)。
2.SpringBoot2.0如何整合HikariCP
1.因爲SpringBoot2.0已經整合HikariCP的jar包了,所以不用在pom文件裏引用了
2.在application.yml文件中配置數據源
############################################################
#
# 配置數據源信息
#
############################################################
spring:
  datasource:                                           # 數據源的相關配置
    type: com.zaxxer.hikari.HikariDataSource     # 數據源類型:HikariCP
    driver-class-name: com.mysql.jdbc.Driver       # mysql驅動
    url: jdbc:mysql://localhost:3306/foodie-shop-dev?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
    username: root
    password: root
    hikari:
      connection-timeout: 30000       # 等待連接池分配連接的最大時長(毫秒),超過這個時長還沒可用的連接則發生SQLException, 默認:30秒
      minimum-idle: 5                 # 最小連接數
      maximum-pool-size: 20           # 最大連接數
      auto-commit: true               # 自動提交
      idle-timeout: 600000            # 連接超時的最大時長(毫秒),超時則被釋放(retired),默認:10分鐘
      pool-name: DateSourceHikariCP     # 連接池名字
      max-lifetime: 1800000           # 連接的生命時長(毫秒),超時而且沒被使用則被釋放(retired),默認:30分鐘 1800000ms
      connection-test-query: SELECT 1
3.連接池中的最大連接數是越大越好嘛?

錯:連接數的多少與cpu的核數有關,大家應該知道在一核cup上同一時刻只能運行一個線程,那是如何實現“同時”運行幾百個線程的呢?那是因爲操作系統切換上下文,CPU 核心快速調度,執行另一個線程的代碼,不停反覆,給我們造成了所有進程同時運行假象。所以在一個線程上順序執行A和B一定比通過時間分片切換“同時”執行A和B要快,那麼在多核情況下一旦線程數超過核數,在增加線程數系統會變得更慢,所以並不是鏈接數越大就越好

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章