Druid連接配接池是阿裡巴巴内部唯一使用的連接配接池,内置強大的監控功能,監控特性不影響性能。功能強大,能防SQL注入,内置Loging能診斷Hack應用行為。,在内部資料庫相關中間件TDDL/DRDS 都内置使用強依賴了Druid連接配接池,經過阿裡内部數千上萬的系統大規模驗證,經過曆年雙十一超大規模并發驗證。
Spring Boot 2.0 以上預設使用 Hikari 資料源,可以說 Hikari 與 Driud 都是目前 Java Web 上最優秀的資料源,我們來重點介紹 Spring Boot 如何內建 Druid 資料源,如何實作資料庫監控。
特點:
1)穩定性特性,阿裡巴巴的業務驗證
2)完備的監控資訊,快速診斷系統的瓶頸
3)内置了WallFilter 提供防SQL注入功能
1. 引入POM依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
2. 切換預設資料源
Spring Boot 2.0 以上預設使用 com.zaxxer.hikari.HikariDataSource 資料源,但可以 通過 spring.datasource.type 指定資料源
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
配置完成後,重新啟動項目,通過測試類DataSource可以看到資料源已經切換成功
@Resource
private DataSource dataSource;
@Test
void JDBCTest() throws SQLException {
System.err.println(dataSource.getClass());
}
3. 修改資料源相關配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
# 初始化時建立實體連接配接的個數
initialSize: 5
# 最小連接配接池數量
minIdle: 5
# 最大連接配接池數量
maxActive: 201
# 擷取連接配接時最大等待時間,機關毫秒
maxWait: 60000
# 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接配接,機關是毫秒
timeBetweenEvictionRunsMillis: 60000
# 連接配接保持空閑而不被驅逐的最小時間
minEvictableIdleTimeMillis: 300000
# 用來檢測連接配接是否有效的sql,要求是一個查詢語句
validationQuery: SELECT 1 FROM DUAL
# 建議配置為true,不影響性能,并且保證安全性。申請連接配接的時候檢測,如果空閑時間大于timeBetweenEvictionRunsMillis,執行validationQuery檢測連接配接是否有效。
testWhileIdle: true
# 申請連接配接時執行validationQuery檢測連接配接是否有效,做了這個配置會降低性能。
testOnBorrow: false
# 歸還連接配接時執行validationQuery檢測連接配接是否有效,做了這個配置會降低性能。
testOnReturn: false
# 是否緩存preparedStatement,也就是PSCache。PSCache對支援遊标的資料庫性能提升巨大,比如說oracle。在mysql下建議關閉。
poolPreparedStatements: true
# 配置監控統計攔截的filters,去掉後監控界面sql無法統計,'wall'用于防火牆
filters: stat,wall,log4j
# 要啟用PSCache,必須配置大于0,當大于0時,poolPreparedStatements自動觸發修改為true。
maxPoolPreparedStatementPerConnectionSize: 20
# 合并多個DruidDataSource的監控資料
useGlobalDataSourceStat: true
# 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
Druid常用配置項及解釋
配置 | 預設值 | 說明 |
---|---|---|
name | 配置這個屬性的意義在于沒如果存在多個資料源,監控的時候可以通過名字來區分開來。如果沒有配置,将會生成一個名字,格式是"DataSource-"+System.identityHashCode(this) | |
jdbcurl | 連接配接資料庫的url,不同資料庫不一樣 | |
username | 連接配接資料庫的使用者名 | |
password | 連接配接資料庫的密碼。如果你不希望密碼直接寫在配置檔案中 | |
driverClassName | 這一項可配可不配,如果不配置druid會根據url自動識别dbType,然後選擇相應的driverClassName(建議配置下) | |
initialSize | 初始化時建立實體連接配接的個數,初始化發生在顯示調用init方法,或者第一次getConnection時 | |
maxActive | 8 | 最大連接配接池數量 |
maxIdle | 已經不再使用,配置了也沒效果 | |
minIdle | 最小連接配接池數量 | |
maxWait | 擷取連接配接時最大等待時間,機關毫秒,配置了maxWait之後,預設啟用公平鎖,并發效率會有所下降,如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖 | |
poolPreparedStatements | false | 是否緩存preparedStatement,也就是PsCache。PSCache對支援遊标的資料庫性能提升巨大,比如說oracle。在mysql下建議關閉 |
maxOpenPreparedStatements | -1 | 要啟用PSCache,必須配置大于0,當大于0時,poolPreparedStatements自動觸發修改為true。在Druid中,不會存在Oracle下PSCache占用記憶體過多的問題,可以把這個數值配置打一下,比如說100 |
validationQuery | 用來檢測連接配接是否有效的sql,要求是一個查詢語句。如果validationQuery為null,testOnBorrow、testOnReturn 、testWhileIdle都不會起作用 | |
testOnBorrow | true | 申請連接配接時執行validationQuery檢測連接配接是否有效,做了這個配置會降低性能 |
testOnReturn | 歸還連接配接時執行它validationQuery檢測連接配接是否有效,做了這個配置會降低性能 | |
testWhileIdle | 建議配置為true,不影響性能,并且保證安全性。申請連接配接的時候檢測,如果空閑時間大于timeBetweenEvictionRunMills,執行validationQuery檢測連接配接是否有效 | |
timeBetweenEvictionRunMillis | 1分鐘 | 有兩個含義:Destory線程會檢測連接配接的間隔時間 testWhileIdle的判斷依據,詳細看testWhileIdele屬性的說明 |
numTestsPerEvictionRun | 不再使用,一個DruidDataSource隻支援一個EvicationRun | |
minEvictableIdleTimeMillis | 30分鐘 | |
connectionInitSqls | 實體連接配接初始化的時候執行sql | |
exceptionSorter | 根據DBType自動識别 | 當資料庫抛出一些不可恢複的異常時,抛棄連接配接 |
filters | 屬性類型是字元串,通過别名的方式配置擴充插件,常用的插件有:監控統計用的filter:stat日志用的filter;log4j防禦注入的filter:wall | |
proxyFilters | 類型是List<com.alibaba.druid,filter.Filter>,如果同時配置filter和proxyFilters,是組合關系,并非 |
4.編寫Druid監控
Druid資料源具有監控的功能,并提供了一個 web 界面友善使用者檢視,編寫Druid配置類來配置監控
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druidDatasource() {
return new DruidDataSource();
}
//配置 Druid 監控管理背景的Servlet;
//内置 Servlet 容器時沒有web.xml檔案,是以使用 Spring Boot 的注冊 Servlet 方式
@Bean
public ServletRegistrationBean statViewServlet() {
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
// 這些參數可以在 com.alibaba.druid.support.http.StatViewServlet 的父類 com.alibaba.druid.support.http.ResourceServlet 中找到
Map<String, String> initParams = new HashMap<>();
initParams.put("loginUsername", "admin");
initParams.put("loginPassword", "123456");
initParams.put("allow", ""); //預設就是允許所有通路
initParams.put("deny", "192.168.10.132"); //deny:Druid 背景拒絕誰通路,表示禁止此ip通路
initParams.put("resetEnable","false"); //是否可以重置資料
bean.setInitParameters(initParams);
return bean;
}
//2、配置一個web監控的filter
@Bean
public FilterRegistrationBean webStatFilter() {
//建立過濾器
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
Map<String, String> initParams = new HashMap<>();
// 或略過濾的形式
initParams.put("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
bean.setInitParameters(initParams);
//設定過濾路徑
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}
5.監控連接配接
啟動項目,通路
http://localhost:8080/druid/login.html 即可進入Druid監控的登入頁面
輸入剛剛配置的使用者名和密碼

順利登陸相關背景,在背景可以對目前資料源的各項資料進行檢視