簡介
說明
本文介紹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 | |