SpringBoot學習筆記——集成Druid數據庫連接池

一、前言

在軟件系統中都會使用到數據庫,是開發中大型系統不可缺少的。但如果對數據庫資源沒有很好地管理,往往會直接導致系統的穩定。隨着系統流量、用戶的增加,會逐步顯露。使用數據庫連接池可以更好、更高效的管理數據庫連接資源,我們可以直接使用第三方服務,不必自己思索數據庫連接的管理。

數據庫連接池技術有:DBCP 、tomcat-jdbc、C3P0、HikariCP、Druid等。
優先推薦Druid。它作爲國貨,更加符合國人的思維,功能豐富,還經歷了千錘百煉。

二、數據庫連接池

數據庫連接是一種關鍵的有限的昂貴的資源,這一點在多用戶的網頁應用程序中體現得尤爲突出。對數據庫連接的管理能顯著影響到整個應用程序的伸縮性和健壯性,影響到程序的性能指標。數據庫連接池正是針對這個問題提出來的。數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重複使用一個現有的數據庫連接,而不是再重新建立一個;釋放空閒時間超過最大空閒時間的數據庫連接來避免因爲沒有釋放數據庫連接而引起的數據庫連接遺漏。這項技術能明顯提高對數據庫操作的性能。

數據庫連接池優點:

  • 資源重用
  • 更快的系統響應速度
  • 高效資源分配手段
  • 統一的連接管理,避免數據庫連接泄漏

三、SpringBoot數據庫連接池

SpringBoot 2.2.6 文檔說明:
database pool

  1. 由於HikariCP的性能和併發性。如果有HikariCP,SpringBoot會選擇它。
  2. 否則,如果Tomcat數據源連接池可用,也可以使用它。
  3. 如果HikariCP和Tomcat數據源連接池都不可用,並且如果Commons DBCP2可用,就使用它。

可以使用spring.datasource.type屬性來指定要使用的連接池。
如果使用spring-boot-starter-jdbcspring-boot-starter-data-jpa,將自動獲得對HikariCP的依賴。

四、Druid數據庫連接池

Druid連接池是阿里巴巴開源的數據庫連接池項目(阿里巴巴數據庫事業部出品)。Druid連接池爲監控而生,內置強大的監控功能,監控特性不影響性能。功能強大,能防SQL注入,內置Loging能診斷Hack應用行爲。
Druid 是一個 JDBC 組件庫,包含數據庫連接池、SQL Parser 等組件, 被大量業務和技術產品使用或集成,經歷過最嚴苛線上業務場景考驗。是Java語言中最好的數據庫連接池。

官方提供對比:Druid連接池在性能、監控、診斷、安全、擴展性這些方面遠遠超出競品。

功能類別 功能 Druid HikariCP DBCP Tomcat-jdbc C3P0
性能 PSCache
LRU
SLB負載均衡支持
穩定性 ExceptionSorter
擴展 擴展 Filter JdbcIntercepter
監控 監控方式 jmx/log/http jmx/metrics jmx jmx jmx
支持SQL級監控
Spring/Web關聯監控
診斷支持 LogFilter
連接泄露診斷 logAbandoned
安全 SQL防注入
支持配置加密

五、springboot集成Druid

5.1 環境說明

開發工具:IDEA 2019.3.1
框架版本:SpringBoot 2.2.6
數據庫:MySql 8.0.19
數據庫連接池:Druid 1.1.9

5.2 集成步驟

5.2.1 添加maven依賴

<!-- Druid數據庫連接池 -->
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.1.9</version>
</dependency>

5.2.2Druid 配置

application.properties文件

# ======================================== Druid 配置 ========================================= #
# 要使用的連接池實現的全限定名。默認情況下,它是從類路徑自動檢測到的。
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

# JDBC配置:
# JDBC驅動程序的完全限定名。默認情況下基於URL自動檢測
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
# 數據庫的JDBC URL
spring.datasource.druid.url=jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&allowPublicKeyRetrieval=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
# 數據庫登錄用戶名
spring.datasource.druid.username=root
# 數據庫登錄密碼
spring.datasource.druid.password=root

# 連接池配置:
# 初始化時建立物理連接的個數
spring.datasource.druid.initial-size=2
# 最大連接池數量
spring.datasource.druid.max-active=10
# 最小連接池數量
spring.datasource.druid.min-idle=2
# 屬性類型是字符串,通過別名的方式配置擴展插件,配置多個英文逗號分隔。
# 常用的插件有:監控統計用的filter:stat,日誌用的filter:log4j,防禦sql注入的filter:wall
spring.datasource.druid.filters=stat,wall

# 監控配置:
# WebStatFilter配置
# 是否啓用StatFilter默認值false
spring.datasource.druid.web-stat-filter.enabled=true
spring.datasource.druid.web-stat-filter.url-pattern=/*
# 排除不必要的url
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
# 是否開啓session統計功能
spring.datasource.druid.web-stat-filter.session-stat-enable=true
# session最大數,缺省sessionStatMaxCount是1000個
spring.datasource.druid.web-stat-filter.session-stat-max-count=500
# 用戶user信息保存在session中的sessionName,druid能夠知道當前的session用戶
spring.datasource.druid.web-stat-filter.principal-session-name=web_user
# 用戶user信息保存在cookie 中的cookieName,druid能夠知道當前的用戶
#spring.datasource.druid.web-stat-filter.principal-cookie-name=
# 監控單個url調用的sql列表
spring.datasource.druid.web-stat-filter.profile-enable=true

# StatViewServlet配置
# 是否啓用StatViewServlet(監控頁面)默認值爲false(考慮到安全問題默認並未啓動,如需啓用建議設置密碼或白名單以保障安全)
spring.datasource.druid.stat-view-servlet.enabled=true
# 訪問url模式
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
# 是否允許清空統計數據
spring.datasource.druid.stat-view-servlet.reset-enable=true
# 監控頁面訪問用戶名
spring.datasource.druid.stat-view-servlet.login-username=admin
# 監控頁面訪問密碼
spring.datasource.druid.stat-view-servlet.login-password=admin
# -訪問控制:
#   -deny優先於allow,如果在deny列表中,就算在allow列表中,也會被拒絕。
#   -如果allow沒有配置或者爲空,則允許所有訪問)
#   -由於匹配規則不支持IPV6,配置了allow或者deny之後,會導致IPV6無法訪問
# 訪問控制,白名單IP
#spring.datasource.druid.stat-view-servlet.allow=
# 訪問控制,黑名單IP
#spring.datasource.druid.stat-view-servlet.deny=

# Spring監控配置
# Spring監控AOP切入點,如x.y.z.service.*,配置多個英文逗號分隔
#spring.datasource.druid.aop-patterns=

# ======================================== Druid 配置 結束 ========================================= #

DruidDataSource配置屬性列表
DruidDataSource配置兼容DBCP,但個別配置的語意有所區別。

配置 缺省值 說明
name 配置這個屬性的意義在於,如果存在多個數據源,監控的時候可以通過名字來區分開來。如果沒有配置,將會生成一個名字,格式是:"DataSource-" + System.identityHashCode(this). 另外配置此屬性至少在1.0.5版本中是不起作用的,強行設置name會出錯。
url 連接數據庫的url,不同數據庫不一樣。例如: mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
username 連接數據庫的用戶名
password 連接數據庫的密碼。如果你不希望密碼直接寫在配置文件中,可以使用ConfigFilter。
driverClassName 根據url自動識別 這一項可配可不配,如果不配置druid會根據url自動識別dbType,然後選擇相應的driverClassName
initialSize 0 初始化時建立物理連接的個數。初始化發生在顯示調用init方法,或者第一次getConnection時
maxActive 8 最大連接池數量
minIdle 最小連接池數量
maxWait 獲取連接時最大等待時間,單位毫秒。配置了maxWait之後,缺省啓用公平鎖,併發效率會有所下降,如果需要可以通過配置useUnfairLock屬性爲true使用非公平鎖。
poolPreparedStatements false 是否緩存preparedStatement,也就是PSCache。PSCache對支持遊標的數據庫性能提升巨大,比如說oracle。在mysql下建議關閉。
maxPoolPreparedStatementPerConnectionSize -1 要啓用PSCache,必須配置大於0,當大於0時,poolPreparedStatements自動觸發修改爲true。在Druid中,不會存在Oracle下PSCache佔用內存過多的問題,可以把這個數值配置大一些,比如說100
validationQuery 用來檢測連接是否有效的sql,要求是一個查詢語句,常用select 'x'。如果validationQuery爲null,testOnBorrow、testOnReturn、testWhileIdle都不會起作用。
validationQueryTimeout 單位:秒,檢測連接是否有效的超時時間。底層調用jdbc Statement對象的void setQueryTimeout(int seconds)方法
testOnBorrow true 申請連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能。
testOnReturn false 歸還連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能。
testWhileIdle false 建議配置爲true,不影響性能,並且保證安全性。申請連接的時候檢測,如果空閒時間大於timeBetweenEvictionRunsMillis,執行validationQuery檢測連接是否有效。
keepAlive false(1.0.28) 連接池中的minIdle數量以內的連接,空閒時間超過minEvictableIdleTimeMillis,則會執行keepAlive操作。
timeBetweenEvictionRunsMillis 1分鐘(1.0.14) 有兩個含義:
1) Destroy線程會檢測連接的間隔時間,如果連接空閒時間大於等於minEvictableIdleTimeMillis則關閉物理連接。
2) testWhileIdle的判斷依據,詳細看testWhileIdle屬性的說明
minEvictableIdleTimeMillis 連接保持空閒而不被驅逐的最小時間
connectionInitSqls 物理連接初始化的時候執行的sql
exceptionSorter 根據dbType自動識別 當數據庫拋出一些不可恢復的異常時,拋棄連接
filters 屬性類型是字符串,通過別名的方式配置擴展插件,常用的插件有:
監控統計用的filter:stat
日誌用的filter:log4j
防禦sql注入的filter:wall
proxyFilters 類型是List<com.alibaba.druid.filter.Filter>,如果同時配置了filters和proxyFilters,是組合關係,並非替換關係

5.2.3監控頁面

Druid內置提供了一個StatViewServlet用於展示Druid的統計信息。
這個StatViewServlet的用途包括:

  • 提供監控信息展示的html頁面
  • 提供監控信息的JSON API

輸入 http://127.0.0.1:8080/demo/druid 進入Druid監控登錄頁面,輸入配置中的用戶名和密碼。
Druid監控登錄頁面
進入到Druid監控頁面,可以看到非常全面的系統監控數據。
Druid監控頁面

六、總結說明

目前只是springboot集成了Druid連接池,並可以進入監控頁面進行查看相關監控數據。後期可以將監控頁面嵌入到系統中,或是直接獲取監控數據自行展示。




不積跬步,無以至千里;不積小流,無以成江海。 -荀子

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