天天看點

SpringBoot整合阿裡巴巴Druid資料源1. 引入POM依賴2. 切換預設資料源3. 修改資料源相關配置4.編寫Druid監控5.監控連接配接

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監控的登入頁面

輸入剛剛配置的使用者名和密碼

SpringBoot整合阿裡巴巴Druid資料源1. 引入POM依賴2. 切換預設資料源3. 修改資料源相關配置4.編寫Druid監控5.監控連接配接

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

SpringBoot整合阿裡巴巴Druid資料源1. 引入POM依賴2. 切換預設資料源3. 修改資料源相關配置4.編寫Druid監控5.監控連接配接