SpringBoot項目集成阿里Druid鏈接池

目錄

阿里的開源Druid,GitHub上有相關介紹,連接地址以下:html

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中配置相似)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

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

  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…

相關文章
相關標籤/搜索