天天看點

Spring Boot--Druid連接配接池的配置方法

簡介

說明

        本文介紹Spring Boot的Druid連接配接池的配置方法。

        Druid 是阿裡巴巴開源的一個資料庫連接配接池實作,結合了 C3P0、DBCP、PROXOOL 等 DB 池的優點,同時加入了日志監控。Druid支援的監控功能有:統計SQL資訊、SQL性能收集、SQL注入檢查、SQL翻譯等。

官網網址

Druid的github(有解析):​​https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter​​

配置文檔:​​DruidDataSource配置屬性清單 · alibaba/druid Wiki · GitHub​​

配置概述

在Spring Boot自動化配置中,對于資料源的配置可以分為兩類:

通用配置

        以spring.datasource.*的形式存在,主要是配置一些正常内容。比如:資料庫連結位址、使用者名、密碼等。這裡就不做過多說明了,通常就這些配置:

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/test
    username: root
    password: 222333      

資料源連接配接池配置

以spring.datasource.<資料源名稱>.*的形式存在,比如:Druid的配置參數就是spring.datasource.druid.*形式。下面這個是我們最常用的幾個配置項:

spring:
  datasource:
    druid:
      initial-size: 10
      min-idle: 10
      maxActive: 200
      maxWait: 60000
      timeBetweenEvictionRunsMillis: 60000
      minEvictableIdleTimeMillis: 300000
      validationQuery: SELECT 1 FROM DUAL
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 20
      connectionErrorRetryAttempts: 3
      breakAfterAcquireFailure: true
      timeBetweenConnectErrorMillis: 300000
      asyncInit: true
      remove-abandoned: true
      remove-abandoned-timeout: 1800
      transaction-query-timeout: 6000
      filters: stat,wall,log4j2
      connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
      web-stat-filter:
        enabled: true
        url-pattern: "/*"
        exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
      stat-view-servlet:
        url-pattern: "/druid/*"
        allow:
        deny:
        reset-enable: false
        login-username: admin
        login-password: admin      

配置示例

下邊是推薦使用的配置

spring:
  datasource:
    druid:
      initial-size: 10
      min-idle: 10
      maxActive: 200
      maxWait: 60000
      timeBetweenEvictionRunsMillis: 60000
      minEvictableIdleTimeMillis: 300000
      validationQuery: SELECT 1 FROM DUAL
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 20
      connectionErrorRetryAttempts: 3
      breakAfterAcquireFailure: true
      timeBetweenConnectErrorMillis: 300000
      asyncInit: true
      remove-abandoned: true
      remove-abandoned-timeout: 1800
      transaction-query-timeout: 6000
      filters: stat,wall,log4j2
      connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
      web-stat-filter:
        enabled: true
        url-pattern: "/*"
        exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
      stat-view-servlet:
        url-pattern: "/druid/*"
        allow:
        deny:
        reset-enable: false
        login-username: admin
        login-password: admin      

配置詳解

配置 預設值 說明
name 配置這個屬性的意義在于,如果存在多個資料源,監控的時候可以通過名字來區分開來。如果沒有配置,将會生成一個名字,格式是:"DataSource-" + System.identityHashCode(this). 另外配置此屬性至少在1.0.5版本中是不起作用的,強行設定name會出錯。​​詳情-點此處​​。
url

連接配接資料庫的url,不同資料庫不一樣。例如:

mysql : jdbc:mysql://10.20.153.104:3306/druid2

oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto

username 連接配接資料庫的使用者名
password 連接配接資料庫的密碼。如果你不希望密碼直接寫在配置檔案中,可以使用ConfigFilter。​​​​
driverClassName 根據url自動識别 這一項可配可不配,如果不配置druid會根據url自動識别dbType,然後選擇相應的driverClassName
initialSize 初始化時建立實體連接配接的個數。初始化發生在顯示調用init方法,或者第一次getConnection時
maxActive 8 最大連接配接池數量
maxIdle 8 已經不再使用,配置了也沒效果
minIdle 最小連接配接池數量
maxWait 擷取連接配接時最大等待時間,機關毫秒。配置了maxWait之後,預設啟用公平鎖,并發效率會有所下降,如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖。
poolPreparedStatements false 是否緩存preparedStatement,也就是PSCache。PSCache對支援遊标的資料庫性能提升巨大,比如說oracle。在mysql下建議關閉。
maxPoolPreparedStatementPerConnectionSize -1 要啟用PSCache,必須配置大于0,當大于0時,poolPreparedStatements自動觸發修改為true。在Druid中,不會存在Oracle下PSCache占用記憶體過多的問題,可以把這個數值配置大一些,比如說100
validationQuery 用來檢測連接配接是否有效的sql,要求是一個查詢語句,常用select 'x'。如果validationQuery為null,testOnBorrow、testOnReturn、testWhileIdle都不會起作用。
validationQueryTimeout 機關:秒,檢測連接配接是否有效的逾時時間。底層調用jdbc Statement對象的void setQueryTimeout(int seconds)方法
testOnBorrow true 申請連接配接時執行validationQuery檢測連接配接是否有效,做了這個配置會降低性能。
testOnReturn false 歸還連接配接時執行validationQuery檢測連接配接是否有效,做了這個配置會降低性能。
testWhileIdle false 建議配置為true,不影響性能,并且保證安全性。申請連接配接的時候檢測,如果空閑時間大于timeBetweenEvictionRunsMillis,執行validationQuery檢測連接配接是否有效。
keepAlive

false

(1.0.28)

連接配接池中的minIdle數量以内的連接配接,空閑時間超過minEvictableIdleTimeMillis,則會執行keepAlive操作。
timeBetweenEvictionRunsMillis 1分鐘(1.0.14)

有兩個含義:

1) Destroy線程會檢測連接配接的間隔時間,如果連接配接空閑時間大于等于minEvictableIdleTimeMillis則關閉實體連接配接。

2) testWhileIdle的判斷依據,詳細看testWhileIdle屬性的說明

numTestsPerEvictionRun 30分鐘(1.0.14) 不再使用,一個DruidDataSource隻支援一個EvictionRun
minEvictableIdleTimeMillis 連接配接保持空閑而不被驅逐的最小時間
connectionInitSqls 實體連接配接初始化的時候執行的sql
exceptionSorter 根據dbType自動識别 當資料庫抛出一些不可恢複的異常時,抛棄連接配接
filters

屬性類型是字元串,通過别名的方式配置擴充插件,常用的插件有:

監控統計用的filter:stat

日志用的filter:log4j

防禦sql注入的filter:wall