SpringBoot學習之整合Druid的簡單應用
阿新 • • 發佈:2020-07-29
# 一、Druid介紹
## Druid簡介
Druid是目前Java語言中最好的資料庫連線池之一。結合了 C3P0、DBCP 等 DB 池的優點,同時加入了日誌監控。Druid 是一個分散式的、支援實時多維 OLAP 分析的資料處理系統。它既支援高速的資料實時攝入處理,也支援實時且靈活的多維資料分析查詢。
Druid已經在阿里巴巴部署了超過600個應用,經過生產環境大規模部署的嚴苛考驗。Spring Boot 2.0 以上預設使用 Hikari 資料來源,可以說 Hikari 與 Driud 都是當前 Java Web 上最優秀的資料來源。
## Druid特性
**支援**
- 亞秒響應的互動式查詢,支援較高併發。
- 支援實時匯入,匯入即可被查詢,支援高併發匯入。
- 採用分散式 shared-nothing 的架構,可以擴充套件到PB級。
- 支援聚合函式,count 和 sum,以及使用 javascript 實現自定義 UDF。
- 支援複雜的 Aggregator,近似查詢的 Aggregator 例如 HyperLoglog 以及 Yahoo 開源的 DataSketches。
- 支援Groupby,Select,Search查詢。
- 不支援大表之間的Join,但其 lookup 功能滿足和維度表的 Join。
**不支援**
- 不支援精確去重
- 不支援 Join(只能進行 semi-join)
- 不支援根據主鍵的單條記錄更新
**Druid下載**
1. maven中央倉庫: http://central.maven.org/maven2/com/alibaba/druid/
2. 原始碼倉庫地址: https://github.com/alibaba/druid
## Druid可以做什麼
1) 可以監控資料庫訪問效能,Druid內建提供了一個功能強大的StatFilter外掛,能夠詳細統計SQL的執行效能,這對於線上分析資料庫訪問效能有幫助。
2) 替換DBCP和C3P0。Druid提供了一個高效、功能強大、可擴充套件性好的資料庫連線池。
3) 資料庫密碼加密。直接把資料庫密碼寫在配置檔案中,這是不好的行為,容易導致安全問題。DruidDruiver和DruidDataSource都支援PasswordCallback。
4) SQL執行日誌,Druid提供了不同的LogFilter,能夠支援Common-Logging、Log4j和JdkLog,你可以按需要選擇相應的LogFilter,監控你應用的資料庫訪問情況。
# 二、Druid在SpringBoot中的整合
## 配置Druid資料來源
這裡基於SpringBoot 2.3.2、IntelliJ IDEA開發工具、Maven 3.6.3、Mysql 8.0.20
### 1.在 Spring Boot 專案中的Pom.xml檔案中加入druid-spring-boot-starter依賴
```xml
```
### 2.新增application的配置項,這裡使用yaml檔案格式
```yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 970628
# 切換Druid資料來源
type: com.alibaba.druid.pool.DruidDataSource
#Spring Boot 預設是不注入這些屬性值的,需要自己繫結
#druid 資料來源專有配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
```
> 注意:
> 1. url中在mysql的8版本以上的可能需要設定時區: `serverTimezone=UTC`
> 2. driver-class-name資料庫驅動,如果是mysql8版本以上的使用 `com.mysql.cj.jdbc.Driver`,低版本的使用 `com.mysql.jdbc.Driver`
> 3. type屬性是切換資料來源為Druid,SpringBoot 2.0以上預設的資料來源為 `com.zaxxer.hikari.HikariDataSource`
這只是部分屬性配置,下面是常用的其他配置項,可以根據情況選擇。
|配置|預設值|說明|
|:-:|:-:|:-:|
|name||配置這個屬性的意義在於,如果存在多個數據源,監控的時候
可以通過名字來區分開來。如果沒有配置,將會生成一個名字,
格式是:”DataSource-” + System.identityHashCode(this)| |jdbcUrl||連線資料庫的url,不同資料庫不一樣。例如:
mysql : jdbc:mysql://10.20.153.104:3306/druid2
oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto| |username||連線資料庫的使用者名稱| |password||連線資料庫的密碼。如果你不希望密碼直接寫在配置檔案中,
可以使用ConfigFilter。詳細看這裡:
https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter| |driverClassName|driverClassName|這一項可配可不配,如果不配置druid會根據url自動識別dbType,
然後選擇相應的driverClassName| |initialSize|0|初始化時建立物理連線的個數。初始化發生在顯示呼叫init方法,
或者第一次getConnection時| |maxActive|8|最大連線池數量| maxIdle|8|已經不再使用,配置了也沒效果| |minIdle||最小連線池數量| |maxWait||獲取連線時最大等待時間,單位毫秒。配置了maxWait之後,
預設啟用公平鎖,併發效率會有所下降,
如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖。| |poolPreparedStatements|false|是否快取preparedStatement,也就是PSCache。
PSCache對支援遊標的資料庫效能提升巨大,比如說oracle。
在mysql5.5以下的版本中沒有PSCache功能,建議關閉掉。
5.5及以上版本有PSCache,建議開啟。| |maxOpenPreparedStatements|-1|要啟用PSCache,必須配置大於0,當大於0時,
poolPreparedStatements自動觸發修改為true。
在Druid中,不會存在Oracle下PSCache佔用記憶體過多的問題,
可以把這個數值配置大一些,比如說100| |validationQuery||用來檢測連線是否有效的sql,要求是一個查詢語句。
如果validationQuery為null,testOnBorrow、testOnReturn、
testWhileIdle都不會其作用。| |testOnBorrow|true|申請連線時執行validationQuery檢測連線是否有效,
做了這個配置會降低效能。| |testOnReturn|false|歸還連線時執行validationQuery檢測連線是否有效,
做了這個配置會降低效能| |testWhileIdle|false|建議配置為true,不影響效能,並且保證安全性。
申請連線的時候檢測,如果空閒時間大於
timeBetweenEvictionRunsMillis,
執行validationQuery檢測連線是否有效| |timeBetweenEvictionRunsMillis||有兩個含義:
1) Destroy執行緒會檢測連線的間隔時間
2) testWhileIdle的判斷依據,詳細看testWhileIdle屬性的說明| |connectionInitSqls||物理連線初始化的時候執行的sql| |exceptionSorter|根據dbType自動識別|當資料庫丟擲一些不可恢復的異常時,拋棄連線| |filters||屬性型別是字串,通過別名的方式配置擴充套件外掛| |proxyFilters||類
可以通過名字來區分開來。如果沒有配置,將會生成一個名字,
格式是:”DataSource-” + System.identityHashCode(this)| |jdbcUrl||連線資料庫的url,不同資料庫不一樣。例如:
mysql : jdbc:mysql://10.20.153.104:3306/druid2
oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto| |username||連線資料庫的使用者名稱| |password||連線資料庫的密碼。如果你不希望密碼直接寫在配置檔案中,
可以使用ConfigFilter。詳細看這裡:
https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter| |driverClassName|driverClassName|這一項可配可不配,如果不配置druid會根據url自動識別dbType,
然後選擇相應的driverClassName| |initialSize|0|初始化時建立物理連線的個數。初始化發生在顯示呼叫init方法,
或者第一次getConnection時| |maxActive|8|最大連線池數量| maxIdle|8|已經不再使用,配置了也沒效果| |minIdle||最小連線池數量| |maxWait||獲取連線時最大等待時間,單位毫秒。配置了maxWait之後,
預設啟用公平鎖,併發效率會有所下降,
如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖。| |poolPreparedStatements|false|是否快取preparedStatement,也就是PSCache。
PSCache對支援遊標的資料庫效能提升巨大,比如說oracle。
在mysql5.5以下的版本中沒有PSCache功能,建議關閉掉。
5.5及以上版本有PSCache,建議開啟。| |maxOpenPreparedStatements|-1|要啟用PSCache,必須配置大於0,當大於0時,
poolPreparedStatements自動觸發修改為true。
在Druid中,不會存在Oracle下PSCache佔用記憶體過多的問題,
可以把這個數值配置大一些,比如說100| |validationQuery||用來檢測連線是否有效的sql,要求是一個查詢語句。
如果validationQuery為null,testOnBorrow、testOnReturn、
testWhileIdle都不會其作用。| |testOnBorrow|true|申請連線時執行validationQuery檢測連線是否有效,
做了這個配置會降低效能。| |testOnReturn|false|歸還連線時執行validationQuery檢測連線是否有效,
做了這個配置會降低效能| |testWhileIdle|false|建議配置為true,不影響效能,並且保證安全性。
申請連線的時候檢測,如果空閒時間大於
timeBetweenEvictionRunsMillis,
執行validationQuery檢測連線是否有效| |timeBetweenEvictionRunsMillis||有兩個含義:
1) Destroy執行緒會檢測連線的間隔時間
2) testWhileIdle的判斷依據,詳細看testWhileIdle屬性的說明| |connectionInitSqls||物理連線初始化的時候執行的sql| |exceptionSorter|根據dbType自動識別|當資料庫丟擲一些不可恢復的異常時,拋棄連線| |filters||屬性型別是字串,通過別名的方式配置擴充套件外掛| |proxyFilters||類