目錄
阿里的開源Druid,GitHub上有相關介紹,連結地址如下:
- Druid原始碼地址:github.com/alibaba/dru…
- 中文文件:github.com/alibaba/dru…
- 英文文件:github.com/alibaba/dru…
- SpringBoot整合Druid:github.com/alibaba/dru…
1. POM中引入依賴
Maven
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
複製程式碼
Gradle
compile 'com.alibaba:druid-spring-boot-starter:1.1.10'
複製程式碼
2. 配置屬性
application.yml中druid配置屬性如下:(application.properties中配置類似)
spring:
datasource:
druid:
url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
# 初始化物理連線個數
initial-size: 1
# 最大連線池數量
max-active: 20
# 最小連線池數量
min-idle: 5
# 獲取連線時最大等待時間(ms)
max-wait: 60000
# 開啟快取preparedStatement(PSCache)
pool-prepared-statements: true
# 啟用PSCache後,指定每個連線上PSCache的大小
max-pool-prepared-statement-per-connection-size: 20
# 用來檢測連線是否有效的sql
validation-query: select 'x'
# 申請連線時不檢測連線是否有效
test-on-borrow: false
# 歸還連線時不檢測連線是否有效
test-on-return: false
# 申請連線時檢測,如果空閒時間大於timeBetweenEvictionRunsMillis,執行validationQuery檢測連線是否有效(不影響效能)
test-while-idle: true
# 檢測連線的間隔時間,若連線空閒時間 >= minEvictableIdleTimeMillis,則關閉物理連線
time-between-eviction-runs-millis: 60000
# 連線保持空閒而不被驅逐的最小時間(ms)
min-evictable-idle-time-millis: 300000
# 配置監控統計攔截的filters(不配置則監控介面sql無法統計),監控統計filter:stat,日誌filter:log4j,防禦sql注入filter:wall
filters: stat,log4j,wall
# 支援合併多個DruidDataSource的監控資料
use-global-data-source-stat: true
# 通過connectProperties屬性來開啟mergeSql(Sql合併)功能;慢SQL記錄(配置超過5秒就是慢,預設是3秒)
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
複製程式碼
各個配置屬性說明在阿里的Druid GitHub上有介紹,地址:github.com/alibaba/dru…
各個配置屬性參考值,地址: github.com/alibaba/dru…
SQL合併,慢SQL記錄,多個DruidDataSource的監控資料合併配置,地址:github.com/alibaba/dru…
關於一些配置的說明:
-
可能有人對PSCache這兩項配置存在疑問?
# 開啟快取preparedStatement(PSCache) pool-prepared-statements: true # 啟用PSCache後,指定每個連線上PSCache的大小 max-pool-prepared-statement-per-connection-size: 20 複製程式碼
Druid官方建議對於MySQL資料庫,關閉preparedStatement快取(即PSCache),即pool-prepared-statements配置為false。原因是:PSCache對支援遊標的資料庫效能提升巨大,比如說oracle,在mysql下建議關閉。
InfoQ上有一篇文章對其MySQL是否要開啟PSCache做了介紹,地址:www.infoq.cn/article/201…
-
關於url和driver-class-name配置項的說明。
url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false driver-class-name: com.mysql.cj.jdbc.Driver 複製程式碼
-
先說驅動類driver-class-name配置項,為什麼配置值是
com.mysql.cj.jdbc.Driver
,而不是com.mysql.jdbc.Driver
?原因是: 從mysql6開始,驅動包開始使用新的驅動,即
com.mysql.cj.jdbc.Driver
。如果使用的mysql為6.0之後的版本,但使用的是舊的5.0版本的驅動包,則驅動配置為com.mysql.jdbc.Driver
,不過這種使用舊的5.0驅動包可能會出現一些意想不到的問題,所以還是建議將驅動包升級,然後改變驅動的值。解決方法:
<1> 先查一下自己的mysql版本。
在mysql中執行:select VERSION();
相關文章介紹連結地址:blog.csdn.net/lamp_yang_3…
<2> 若mysql版本高於5.0,則將驅動類driver-class-name配置為:
com.mysql.cj.jdbc.Driver
相關異常資訊: Loading class com.mysql.jdbc.Driver. This is deprecated. The new driver class is com.mysql.cj.jdbc.Driver. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
-
再說url配置項,主要是
serverTimezone=GMT%2B8
時區由於mysql版本升級後,新版資料庫和系統之間有了時區差異,需要指定時區
serverTimezone=GMT%2B8
(北京時間東八區),UTC代表是全球標準時間,北京時間東八區領先UTC 8個小時。如果配置
serverTimezone=UTC
(全球標準時間),連線不報錯,但實際資料庫中顯示的時間比我們插入時的時間晚8小時。# 北京時間東八區 serverTimezone=GMT%2B8 # 上海時間 serverTimezone=Asia/Shanghai # 重慶時間 serverTimezone=Asia/Chongqing 複製程式碼
可以參考以下文章介紹:
JDBC連線Mysql資料庫出現的問題彙總:www.jianshu.com/p/bbc76bc5b…
mysql時區錯誤及解決辦法: www.jianshu.com/p/0d53218da…
為何沒有asia/beijing時區?:www.cnblogs.com/softidea/p/…
-
到此SpringBoot專案整合阿里Druid連線池完成了,啟動SpringBoot應用程式,開啟瀏覽器,輸入:http://127.0.0.1:8080/druid/index.html, 即可看到下面的Druid Monitor監控介面:
3. 實踐擴充
丟擲問題1:在實際企業級應用中,資料庫密碼是敏感資訊,SpringBoot整合Druid對資料庫密碼是怎麼加密呢?
進入druid-1.1.10.jar所在資料夾,開啟命令列,執行如下命令:
java -cp druid-1.0.16.jar com.alibaba.druid.filter.config.ConfigTools 123456
說明:123456是要加密的明文密碼
複製程式碼
輸出
privateKey:MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAljkI+2y1h27So4a0+OyZGp093q0VrMZKKgZHCX1X3VHdG914tZsQIpm4SJ9gAQDCeRh5ZcxOI2v2inD+0AQN0QIDAQABAkAmkXom4yAwJ1nZNiqchlJArQJHe3THKRm9dGMkopO+dHN2lKqP1X4FUS7/sPf08uQ+ijH063St+YrNk6qj3nUpAiEAxfGjUG2ZbIYjKqAx9NhGFi1s4xwzp0kK6hUkvRhpKI8CIQDCSFHQVWT2PopjaLWaDTVYUebLZlSOuz8rU6LayFrTnwIhALCIYG5KUJpIxvQtCmCiwV7mBEZH0IlQyzsYwDskmiRhAiBv4Q2cF1DorOMsk+PgLrMFhUSO5QLUnueln6gsrSwAqQIgH0jlqWKuwuuTwZSM4P/HS4YaacrLL70Fe101YF4fjCs=
publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJY5CPtstYdu0qOGtPjsmRqdPd6tFazGSioGRwl9V91R3RvdeLWbECKZuEifYAEAwnkYeWXMTiNr9opw/tAEDdECAwEAAQ==
password:O50UxdSUY9ZGfafYEh9/ovo5Lb8b/FaGlOaZstW+UqMrrz+fanCSALo9OJHrpykY2fyrKdcjp5aE57dzhFRMPQ==
說明:privateKey是私鑰,publicKey是公鑰,password是加密後的密碼
複製程式碼
application.yml中druid配置屬性更改後如下:(application.properties中配置類似)
spring:
datasource:
druid:
url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: O50UxdSUY9ZGfafYEh9/ovo5Lb8b/FaGlOaZstW+UqMrrz+fanCSALo9OJHrpykY2fyrKdcjp5aE57dzhFRMPQ==
driver-class-name: com.mysql.cj.jdbc.Driver
# 初始化物理連線個數
initial-size: 1
# 最大連線池數量
max-active: 20
# 最小連線池數量
min-idle: 5
# 獲取連線時最大等待時間(ms)
max-wait: 60000
# 開啟快取preparedStatement(PSCache)
pool-prepared-statements: true
# 啟用PSCache後,指定每個連線上PSCache的大小
max-pool-prepared-statement-per-connection-size: 20
# 用來檢測連線是否有效的sql
validation-query: select 'x'
# 申請連線時不檢測連線是否有效
test-on-borrow: false
# 歸還連線時不檢測連線是否有效
test-on-return: false
# 申請連線時檢測,如果空閒時間大於timeBetweenEvictionRunsMillis,執行validationQuery檢測連線是否有效(不影響效能)
test-while-idle: true
# 檢測連線的間隔時間,若連線空閒時間 >= minEvictableIdleTimeMillis,則關閉物理連線
time-between-eviction-runs-millis: 60000
# 連線保持空閒而不被驅逐的最小時間(ms)
min-evictable-idle-time-millis: 300000
# 配置監控統計攔截的filters(不配置則監控介面sql無法統計),監控統計filter:stat,日誌filter:log4j,防禦sql注入filter:wall
filters: config,stat,log4j,wall
# 支援合併多個DruidDataSource的監控資料
use-global-data-source-stat: true
# 通過connectProperties屬性來開啟mergeSql(Sql合併)功能;慢SQL記錄(配置超過5秒就是慢,預設是3秒);解密使能
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;config.decrypt=true;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJY5CPtstYdu0qOGtPjsmRqdPd6tFazGSioGRwl9V91R3RvdeLWbECKZuEifYAEAwnkYeWXMTiNr9opw/tAEDdECAwEAAQ==
複製程式碼
配置變更說明:
-
首先把密碼改為加密後的密碼
password: O50UxdSUY9ZGfafYEh9/ovo5Lb8b/FaGlOaZstW+UqMrrz+fanCSALo9OJHrpykY2fyrKdcjp5aE57dzhFRMPQ== 複製程式碼
-
filters配置值中增加config
filters: config,stat,log4j,wall 複製程式碼
說明:Druid對資料庫密碼加密和解密用的都是com.alibaba.druid.filter.config.ConfigFilter這個類,所以在資料來源配置項filters上必須新增上config值,否則始終會丟擲資料庫連線異常。
-
增加connection-properties連線屬性配置項
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;config.decrypt=true;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJY5CPtstYdu0qOGtPjsmRqdPd6tFazGSioGRwl9V91R3RvdeLWbECKZuEifYAEAwnkYeWXMTiNr9opw/tAEDdECAwEAAQ== 說明: connection-properties配置值可配置多個,用“;”分隔 config.decrypt=true 表示解密使能 config.decrypt.key=${publickey} 解密使用上面得到的publicKey公鑰 複製程式碼
阿里的Druid GitHub上有對資料庫密碼加密的介紹,地址:github.com/alibaba/dru…