3、spring boot 配置druid 連接池及監控

 

1、druid githun項目地址

https://github.com/alibaba/druid

https://github.com/alibaba/druid/wiki/常見問題 (必看)

 

2、druid 的過濾器 (重要)

stat,wall,log4j2

stat:Druid內置提供一個StatFilter,用於統計監控信息。

wall:Druid防禦SQL注入攻擊的WallFilter就是通過Druid的SQL Parser分析。Druid提供的SQL Parser可以在JDBC層攔截SQL做相應處理,比如說分庫分表、審計等。

log4j2:這個就是日誌記錄的功能,可以把sql語句打印到log4j2供排查問題。

 

3、在項目中引入druid maven依賴

4、在application.properties 中配置druid啓動參數

druid 參數配置

###### druid 連接池驅動配置信息#############

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

#mysql

#spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver

#spring.datasource.url = jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=GMT%2B8

#spring.datasource.username = root

#spring.datasource.password = root

 

#oracle

spring.datasource.url = jdbc:oracle:thin:@//192.168.0.166:1521/PDBFJ

spring.datasource.driverClassName = oracle.jdbc.driver.OracleDriver

spring.datasource.username=basefj

spring.datasource.password=rootroot

#連接池的配置信息

# 初始化大小,最小,最大

spring.datasource.initialSize=5

spring.datasource.minIdle=5

spring.datasource.maxActive=20

# 配置獲取連接等待超時的時間

spring.datasource.maxWait=60000

# 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連接,單位是毫秒

spring.datasource.timeBetweenEvictionRunsMillis=60000

# 配置一個連接在池中最小生存的時間,單位是毫秒

spring.datasource.minEvictableIdleTimeMillis=300000

#測試連接

#spring.datasource.validationQuery=SELECT 1 FROM DUAL

spring.datasource.validationQuery=SELECT * FROM  SYS_USERS

#申請連接的時候檢測,建議配置爲true,不影響性能,並且保證安全性

spring.datasource.testWhileIdle=true

#獲取連接時執行檢測,建議關閉,影響性能

spring.datasource.testOnBorrow=false

#歸還連接時執行檢測,建議關閉,影響性能

spring.datasource.testOnReturn=false

#是否開啓PSCache,PSCache對支持遊標的數據庫性能提升巨大,oracle建議開啓,mysql下建議關閉

spring.datasource.poolPreparedStatements=false

#開啓poolPreparedStatements後生效

spring.datasource.maxPoolPreparedStatementPerConnectionSize=20

# 配置監控統計攔截的filters,去掉後監控界面sql無法統計,'wall'用於防火牆,log4j2:日誌

spring.datasource.filters=stat,wall,log4j2

# 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄

spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

##日誌配置

# 配置日誌輸出

spring.datasource.druid.filter.slf4j.enabled=true

spring.datasource.druid.filter.slf4j.statement-create-after-log-enabled=false

spring.datasource.druid.filter.slf4j.statement-close-after-log-enabled=false

spring.datasource.druid.filter.slf4j.result-set-open-after-log-enabled=false

spring.datasource.druid.filter.slf4j.result-set-close-after-log-enabled=false

 

5、配置數據源 @Configuration + @Bean 的方式註冊


(1) 聲明 DruidConfig類 並添加 @Configuration 註解

(2)註冊bean @Bean

DruidConfig 啓動配置類

/**

 * @author changneng

 * @version 1.0

 * @title: DruidConfig

 * @description: 配置druid數據源

 * @date 2019/3/1117:07

 */

@Configuration

public class DruidConfig {

 

   private static Logger logger = LoggerFactory.getLogger(DruidConfig.class);

       @Value("${spring.datasource.url}")

       private String dbUrl;

        

       @Value("${spring.datasource.username}")

       private String username;

        

       @Value("${spring.datasource.password}")

       private String password;

        

       @Value("${spring.datasource.driverClassName}")

       private String driverClassName;

        

       @Value("${spring.datasource.initialSize}")

       private int initialSize;

        

       @Value("${spring.datasource.minIdle}")

       private int minIdle;

        

       @Value("${spring.datasource.maxActive}")

       private int maxActive;

        

       @Value("${spring.datasource.maxWait}")

       private int maxWait;

        

       @Value("${spring.datasource.timeBetweenEvictionRunsMillis}")

       private int timeBetweenEvictionRunsMillis;

        

       @Value("${spring.datasource.minEvictableIdleTimeMillis}")

       private int minEvictableIdleTimeMillis;

        

       @Value("${spring.datasource.validationQuery}")

       private String validationQuery;

        

       @Value("${spring.datasource.testWhileIdle}")

       private boolean testWhileIdle;

        

       @Value("${spring.datasource.testOnBorrow}")

       private boolean testOnBorrow;

        

       @Value("${spring.datasource.testOnReturn}")

       private boolean testOnReturn;

        

       @Value("${spring.datasource.poolPreparedStatements}")

       private boolean poolPreparedStatements;

        

       @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")

       private int maxPoolPreparedStatementPerConnectionSize;

        

       @Value("${spring.datasource.filters}")

       private String filters;

        

       @Value("{spring.datasource.connectionProperties}")

       private String connectionProperties;

 

     @Bean     //聲明其爲Bean實例

      @Primary  //在同樣的DataSource中,首先使用被標註的DataSource

       public DataSource dataSource(){

          DruidDataSource datasource = new DruidDataSource();

 

          datasource.setUrl(this.dbUrl);

          datasource.setUsername(username);

          datasource.setPassword(password);

          datasource.setDriverClassName(driverClassName);

           

          //configuration

          datasource.setInitialSize(initialSize);

          datasource.setMinIdle(minIdle);

          datasource.setMaxActive(maxActive);

          datasource.setMaxWait(maxWait);

          datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);

          datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);

          datasource.setValidationQuery(validationQuery);

          datasource.setTestWhileIdle(testWhileIdle);

          datasource.setTestOnBorrow(testOnBorrow);

          datasource.setTestOnReturn(testOnReturn);

          datasource.setPoolPreparedStatements(poolPreparedStatements);

          datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);

          try {

            datasource.setFilters(filters);

         catch (SQLException e) {

            logger.error("druid初始化失敗", e);

 

         }

          datasource.setConnectionProperties(connectionProperties);

           

          return datasource;

       }

 

 

 

}

注: 註冊bean後,在spring bean工廠裏可以找到dataSource 實例了, 集成mybatis後,會自動注入到sqlFactotry中

6、配置druid 監控


(1)聲明druid webservlet @WebServlet

 

druid webservlet

package com.chn.frameweb.core.servlet;

 

import javax.servlet.annotation.WebInitParam;

import javax.servlet.annotation.WebServlet;

 

import com.alibaba.druid.support.http.StatViewServlet;

 

@WebServlet(urlPatterns = "/druid/*", initParams = {

      @WebInitParam(name = "allow", value = "127.0.0.1,localhost"), // IP白名單(沒有配置或者爲空,則允許所有訪問)

      //@WebInitParam(name = "deny", value = ""), // IP黑名單 (存在共同時,deny優先於allow)

      @WebInitParam(name = "loginUsername", value = "admin"), // 用戶名

      @WebInitParam(name = "loginPassword", value = "chn12369"), // 密碼

      @WebInitParam(name = "resetEnable", value = "false")// 禁用HTML頁面上的“Reset All”功能

                                              

})

public class DruidStatServlet extends StatViewServlet {

 

    

   private static final long serialVersionUID = 8445387246000214665L;

           

             

}

(2)配置druid 過濾器 DruidStatFilter

 

DruidStatFilter

/**

 * @author changneng

 * @version 1.0

 * @title: DruidConfig

 * @description: druid過濾器:過濾請求鏈接,將靜態資源及druid本身的請求去除過濾

 * @date 2019/3/1117:07

 */

@WebFilter(filterName = "druidStatFilter", urlPatterns = "/*", initParams = {

      @WebInitParam(name = "exclusions", value = "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*") })

public class DruidStatFilter extends WebStatFilter {

 

}

 

 

(3)訪問監控頁面 http://ip:port/druid/index.html, 例            如 http://localhost:8080/druid/index.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章