SpringBoot專案整合阿里Druid連線池

讓蛋蛋飛發表於2019-02-13

目錄

阿里的開源Druid,GitHub上有相關介紹,連結地址如下:

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…

關於一些配置的說明:

  1. 可能有人對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…

  2. 關於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();

      查詢mysql版本

      相關文章介紹連結地址: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監控介面:

SpringBoot整合阿里Druid連線池

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…

相關文章