springboot14-Druid配置和使用

一、高級配置:druid數據源

1、Druid簡歷:

​ Druid首先是一個數據庫連接池。Druid是目前最好的數據庫連接池,在功能、性能、擴展性方面,都超過其他數據庫連接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已經在阿里巴巴部署了超過600個應用,經過一年多生產環境大規模部署的嚴苛考驗。Druid是阿里巴巴開發的號稱爲監控而生的數據庫連接池!

同時Druid不僅僅是一個數據庫連接池,它包括四個部分:

  • Druid是一個JDBC組件;
  • 基於Filter-Chain模式的插件體系;
  • DruidDataSource 高效可管理的數據庫連接池;
  • SQLParser。

2、Druid功能:

1、替換DBCP和C3P0。Druid提供了一個高效、功能強大、可擴展性好的數據庫連接池。

2、可以監控數據庫訪問性能,Druid內置提供了一個功能強大的StatFilter插件,能夠詳細統計SQL的執行性能,這對於線上分析數據庫訪問性能有幫助。

3、數據庫密碼加密。直接把數據庫密碼寫在配置文件中,這是不好的行爲,容易導致安全問題。DruidDruiver和DruidDataSource都支持PasswordCallback。

4、SQL執行日誌,Druid提供了不同的LogFilter,能夠支持Common-Logging、Log4j和JdkLog,你可以按需要選擇相應的LogFilter,監控你應用的數據庫訪問情況。

5、擴展JDBC,如果你要對JDBC層有編程的需求,可以通過Druid提供的Filter機制,很方便編寫JDBC層的擴展插件。

簡單來說就是:

  • 充當數據庫連接池;
  • 可以監控數據庫訪問性能;
  • 獲得SQL執行日誌。

3、Druid使用和配置:

  • 首先在yml文件中配置Druid配置:
spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://47.97.192.241:3307/jdbcdata?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
#    schema:
#      - classpath:sys_config.sql
#    initialization-mode: always

#    druid配置
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: 60000
    timeBetweenEvictionRrunMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
#      配置監控統計攔截的filters,
#      去掉後監控界面sql無法統計,‘wall’用於防火牆
    filters: stat,wall,log4j
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

注意這裏配置的時候,如果log4j不存在,你可以在pow中添加log4j依賴,也可以修改爲slf4j。但是這樣還是無法使用druid,我們來配置一下druid:

  • 添加Druid配置文件:新建config.DruidConfig
package com.ogj.demojdbc.config;

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.Collections;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class DruidConfig {

    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource druid(){
        return new DruidDataSource();
    }

    //配置Druid的監控
    //1、配置一個管理後臺的servlet
    @Bean
    public ServletRegistrationBean StatViewServlet(){
        ServletRegistrationBean bean=new ServletRegistrationBean<>(new StatViewServlet(),"/druid/*");
        Map<String,String> initParams=new HashMap<>();
        initParams.put("loginUsername","admin");
        initParams.put("loginPassword","123456");
        initParams.put("allow",""); //默認運行所有訪問,可以設置localhost設置和ip
        initParams.put("deny","192.168.42.199"); //拒絕訪問 設置訪問ip

        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,*.css,/druid/*"); //排除攔截
        bean.setInitParameters(initParams);
        //攔截所有請求
        bean.setUrlPatterns(Arrays.asList("/*"));

        return bean;
    }

}

對於servlet配置我們可以設置訪問後臺監控的:

  • loginUsername
  • loginPassword
  • allow:允許哪些ip或者域名訪問
  • deny:拒絕哪些ip或者域名訪問,我們這裏設置我們自己的ip,不能使用ip訪問監控。

對於Filter:

  • 我們設置攔截器:攔截所有除了druid發出的所有請求:druid/*;
  • 監視所有除了排除了的攔截請求;

我們可以來測試一下當前配置是否起效果:

package com.ogj.demojdbc;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

@SpringBootTest
class DemoJdbcApplicationTests {

    @Autowired
    DataSource dataSource;

    @Test
    void contextLoads() throws SQLException {
        System.out.println("----------------");
        System.out.println(dataSource.getClass());
        Connection connection = dataSource.getConnection();
        System.out.println(connection.toString());
        connection.close();
    }

}

在test中進行測試當前配置:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-rkNczUHm-1584205512603)(C:\Users\ouguangji\AppData\Roaming\Typora\typora-user-images\image-20200314234151107.png)]

如果配置成功,那麼會相應的加載同步的設置。

現在我們來開啓SpringBoot主類

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-R9aSubEz-1584205512606)(C:\Users\ouguangji\AppData\Roaming\Typora\typora-user-images\image-20200315005620068.png)]

輸入我們剛剛設置的loginUsername和loginPassword進行登錄。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-UMESbYDs-1584205512607)(C:\Users\ouguangji\AppData\Roaming\Typora\typora-user-images\image-20200315005651771.png)]

然後我們再用瀏覽器來發出一個查詢數據的請求:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-fFusPosP-1584205512609)(C:\Users\ouguangji\AppData\Roaming\Typora\typora-user-images\image-20200315005732689.png)]

我們再來看是否監測到:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-RYGdBvro-1584205512611)(C:\Users\ouguangji\AppData\Roaming\Typora\typora-user-images\image-20200315005800158.png)]

我們可以看到,已經監測到了該次請求,並且我們還能看到該次請求的sql語句:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Q6qy77mW-1584205512615)(C:\Users\ouguangji\AppData\Roaming\Typora\typora-user-images\image-20200315005838603.png)]

我們也可以看到請求的數據源:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-3hVH2qzk-1584205512622)(C:\Users\ouguangji\AppData\Roaming\Typora\typora-user-images\image-20200315005856151.png)]

Druid的基礎學習就在這裏結束啦,不得不說,這一套後臺監測系統,阿里還是很牛批的,阿里無敵!

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