1. 程式人生 > >SpringBoot整合Druid資料來源並監控程式與資料庫資源互動情況

SpringBoot整合Druid資料來源並監控程式與資料庫資源互動情況

在這裡插入圖片描述 Druid是Java語言中最好的資料庫連線池,並且能夠提供強大的監控和擴充套件功能。(Druid可以幫我們時時監控程式與資料庫的互動情況) SpringBoot整合Druid使用步驟:

1. 新建一個Springboot專案後(或者在現有的springboot專案中),在pom.xml中匯入Druid依賴的jar包
    <!-- druid資料庫依賴包 -->		
    <!--導jar包網站:  https://mvnrepository.com/-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.9</version>
    </dependency>
2. 在application.properties配置檔案中新增springData配置屬性
#配置內建tomcat埠號(配置專案埠號,此處可忽略)
server.port=8082

#資料庫配置(若已經配置了,此處可忽略)
spring.jpa.database=mysql
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.100.75:3306/octopus?useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&allowMultiQueries=true
spring.datasource.username=666
spring.datasource.password=mmm

#mybatis 配置(若已經指定mapper對映檔案位置了,此處配置可忽略)
#掃描對映檔案:指定resource下mapper對映檔案位置
mybatis.mapper-locations=classpath:mapper/*/*Mapper.xml
#可在mybatis-config.xml檔案中配置STDOUT_LOGGING,請求時可在控制檯打印出sql語句
mybatis.config-location=classpath:mybatis-config.xml


# 連線池的配置資訊(以下配置選項是此處重點)
# 初始化大小,最小,最大
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20

# 配置當前要使用的資料來源的操作型別
spring.datasource.type = com.alibaba.druid.pool.DruidDataSource

# 配置獲取連線等待超時的時間
spring.datasource.maxWait=60000
# 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒
spring.datasource.timeBetweenEvictionRunsMillis=60000  
# 配置一個連線在池中最小生存的時間,單位是毫秒
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.exceptionSorter=true
spring.datasource.testOnReturn=false
# 開啟PSCache,並且指定每個連線上PSCache的大小
spring.datasource.poolPreparedStatements=true
# 配置監控統計攔截的filters,去掉後監控介面sql無法統計,'wall'用於防火牆
spring.datasource.filters=stat,wall,log4j
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
# 通過connectProperties屬性來開啟mergeSql功能;慢SQL記錄
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
spring.datasource.useGlobalDataSourceStat=true
3. 和application啟動類同級下建立一個config包,用來讀取上面設定的springData資料來源配置項
package com.hokai.config;

import java.sql.SQLException;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import com.alibaba.druid.pool.DruidDataSource;

@Configuration //宣告此類是個配置類,相當於之前的xml配置檔案
@Primary  
/* @Primary :表示這裡定義的DataSource將覆蓋其他來源的DataSource(在同樣的DataSource中,首先使用被標註的DataSource);
此註解最好用在類上,也可以用在方法上,因為此註解用在方法上仍有可能被其他的DataSource覆蓋此處的DataSource */
public class DruidConfiguration {

    @Value("${spring.datasource.url}")      
    private String dbUrl;      

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

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

    @Value("${spring.datasource.driver-class-name}")      
    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.filters}")      
    private String filters; 

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

    @Value("${spring.datasource.connectionProperties}")      
    private String connectionProperties;      

    @Value("${spring.datasource.useGlobalDataSourceStat}")      
    private boolean useGlobalDataSourceStat;  

    /**
     * @Bean 宣告,DataSource 物件為 Spring 容器所管理;
     * @Primary 表示這裡定義的DataSource將覆蓋其他來源的DataSource。
     * StatFilter,用於統計監控資訊。StatFilter的別名是stat。
     * 統計SQL資訊,合併統計。mergeStat是的MergeStatFilter縮寫。
     *     通過 DataSource 的屬性<property name="filters" value="mergeStat" /> 或者
     *  connectProperties屬性來開啟mergeSql功能 <property name="connectionProperties" value="druid.stat.mergeSql=true" />
     * StatFilter屬性slowSqlMillis用來配置SQL慢的標準
     *
     * @return
     */
  @Bean   // DataSource物件被@Bean宣告,交給Spring容器來進行管理
  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);          
         datasource.setUseGlobalDataSourceStat(useGlobalDataSourceStat);          
        try {   
            /**
             * 設定StatFilter,用於統計監控資訊。
             * StatFilter的別名是stat
             */
            datasource.setFilters(filters);         
            } catch (SQLException e) {              
                System.err.println("druid configuration initialization filter: "+ e);          
            }          
        datasource.setConnectionProperties(connectionProperties);  

        return datasource;
    }

}
3. 配置監控統計功能 (在上面建立的config包下新建一個配置類,此處有兩種寫法,兩種寫法任選其一:1.用@bean註解 2.用其他註解)
第一種方式:
    package com.hokai.config;

    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 com.alibaba.druid.support.http.StatViewServlet;
    import com.alibaba.druid.support.http.WebStatFilter;
    @Configuration
    public class DruidMonitorConfig {
        /**
         * 註冊ServletRegistrationBean
         * @return
         */
        @Bean
        public ServletRegistrationBean registrationBean() {
            ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
            /** 初始化引數配置,initParams**/
            //白名單
            //bean.addInitParameter("allow", "127.0.0.1");//多個ip逗號隔開
            //IP黑名單 (存在共同時,deny優先於allow)
            //bean.addInitParameter("deny", "192.168.1.73");
            //登入檢視資訊的賬號密碼.
            bean.addInitParameter("loginUsername", "admin");
            bean.addInitParameter("loginPassword", "123456");
            //是否能夠重置資料.
            bean.addInitParameter("resetEnable", "false");
            return bean;
        }

        /**
         * 註冊FilterRegistrationBean
         * @return
         */
        @Bean
        public FilterRegistrationBean druidStatFilter() {
            FilterRegistrationBean bean = new FilterRegistrationBean(new WebStatFilter());
            //新增過濾規則.
            bean.addUrlPatterns("/*");
            //新增不需要忽略的格式資訊.
            bean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
            return bean;
        }
    }

第二種方式:(建立 DruidStatFilter 和 DruidStatViewServlet 兩個類)
    package com.hokai.config;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.annotation.WebInitParam;
    import com.alibaba.druid.support.http.WebStatFilter;
    /**
     * WebStatFilter用於採集web-jdbc關聯監控的資料。
     * 屬性filterName宣告過濾器的名稱,(可選用)
     * 屬性urlPatterns指定要過濾 的URL模式,也可使用屬性value來宣告.(指定要過濾的URL模式是必選屬性)
     */
    @WebFilter(filterName="druidWebStatFilter",
        urlPatterns="/*",
        initParams={  
            @WebInitParam(name="exclusions",value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"),// 忽略資源  
        })
   // 第二種方式的DruidStatFilter 類
    public class DruidStatFilter extends WebStatFilter{

    }

//-----------------------------------------------------------------
    package com.hokai.config;
    import javax.servlet.annotation.WebInitParam;
    import javax.servlet.annotation.WebServlet;
    import com.alibaba.druid.support.http.StatViewServlet;
        /**
         * StatViewServlet用於展示Druid的統計資訊。
         * 提供監控資訊展示的html頁面
         * 提供監控資訊的JSON API
         *
         * 內建監控頁面的首頁是/druid/index.html
         */

        /**
         * @Webservlet
         * 有兩個屬性可以用來表示Servlet的訪問路徑,分別是value和urlPatterns。value和urlPatterns都是陣列形式,
         * 表示我們可以把一個Servlet對映到多個訪問路徑,但是value和urlPatterns不能同時使用。
         */
     @WebServlet(urlPatterns = "/druid/*",
            initParams={      
            @WebInitParam(name="allow",value=""),// IP白名單 (沒有配置或者為空,則允許所有訪問)      
            @WebInitParam(name="deny",value="192.168.16.111"),// IP黑名單 (存在共同時,deny優先於allow)      
            @WebInitParam(name="loginUsername",value="admin"),// 使用者名稱      
            @WebInitParam(name="loginPassword",value="admin"),// 密碼      
            @WebInitParam(name="resetEnable",value="true")// 禁用HTML頁面上的“Reset All”功能  
      })
       // 第二種方式的DruidStatViewServlet 類
      public class DruidStatViewServlet extends StatViewServlet {
            private static final long serialVersionUID = 1L;
      }
4. 以上全部配置完成後,我們可以啟動專案來進行訪問測試

4.1 開啟瀏覽器輸入路徑: http://localhost:8088/druid/login.html(如果程式中設定了過濾器或攔截器需要將 /druid/**路徑放開) 4.2 登入頁面中輸入我們在配置類中設定的賬號密碼進入Druid監控後臺 4.3 登入成功以後,可以看到Druid主頁面,但是我們點選 資料來源選項卡(展示我們在application.properties中配置的那些引數)、SQL監控選項卡(監控並展示程式每次請求時執行的SQL語句)、SQL防火牆選項卡等可能看不到資料,這個是正常情況,sping boot 啟動的時候沒有進行資料庫操作(也就是說程式不會主動與資料庫進行連線互動操作,只有使用者操作頁面發出請求了,程式才會與資料庫進行互動,如果程式已經和資料庫有互動了,那麼我們就能在資料來源、SQL監控等頁面看到Druid統計的監控資料了),所以這裡就是這樣。紅色div塊一直存在,是Druid程式碼裡寫死的; 4.4 我們先在頁面執行一個操作與資料庫互動後,可以在sql監控選項卡看到執行的sql等資訊了 4.5 再檢視資料來源選項卡可以看到配置連線池引數也都生效了

注:4.4 和4.5 對4.3括號中的內容意思一致,只有與資料庫互動了,Druid就能做資料庫的監控了