阿里的開源Druid,GitHub上有相關介紹,連接地址以下:html
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
複製代碼
compile 'com.alibaba:druid-spring-boot-starter:1.1.10'
複製代碼
application.yml中druid配置屬性以下:(application.properties中配置相似)java
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…mysql
各個配置屬性參考值,地址: github.com/alibaba/dru…git
SQL合併,慢SQL記錄,多個DruidDataSource的監控數據合併配置,地址:github.com/alibaba/dru…github
關於一些配置的說明:spring
可能有人對PSCache這兩項配置存在疑問?sql
# 開啓緩存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/…
進入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…