十六,Spring Boot 整合 Druid 以及使用 Druid 监控功能

十六,Spring Boot 整合 Druid 以及使用 Druid 监控功能

文章目录

  • [十六,Spring Boot 整合 Druid 以及使用 Druid 监控功能](#十六,Spring Boot 整合 Druid 以及使用 Druid 监控功能)
  • [1. Druid 的基本介绍](#1. Druid 的基本介绍)
  • [2. 准备工作:](#2. 准备工作:)
  • [3. Druid 监控功能](#3. Druid 监控功能)
    • [3.1 Druid 监控功能 ------ Web 关联监控](#3.1 Druid 监控功能 —— Web 关联监控)
    • [3.2 Druid 监控功能 ------ SQL监控](#3.2 Druid 监控功能 —— SQL监控)
    • [3.3 Druid 监控功能 ------ SQL防火墙](#3.3 Druid 监控功能 —— SQL防火墙)
    • [3.4 Druid 监控功能 ------ Session 监控](#3.4 Druid 监控功能 —— Session 监控)
  • [4. Druid Spring Boot Starter](#4. Druid Spring Boot Starter)
  • [5. 总结:](#5. 总结:)
  • [6. 最后:](#6. 最后:)

1. Druid 的基本介绍

官方文档 :https://github.com/alibaba/druid

https://github.com/alibaba/druid/wiki/常见问题

HiKariCP:是目前市场上非常优秀的数据源,是 Spring Boot2默认数据源。关于这一点的测试,大家可以移步至 ✏️✏️✏️ 十五,Spring Boot 整合连接数据库(详细配置)-CSDN博客

Druid:性能优秀,Druid提供的监控功能外{Java基础},还集成了SQL监控。可以清楚知道连接池和 SQL的工作情况。所以根据项目需要,我们也要掌握Druid和SpringBoot整合。

Druid到 Spring-Boot方式:两种方式:

  1. 自定义方式

  2. 引入 starter 方式

2. 准备工作:

准备好我们需要测试的数据表,

sql 复制代码
# 创建 furns_ssm
DROP DATABASE if EXISTS spring_boot
CREATE DATABASE spring_boot

USE spring_boot 

# 创建家居表 数据表
CREATE TABLE furn (
id INT(11) PRIMARY KEY auto_increment, -- id
name VARCHAR(64) not NULL, -- 家具名
maker VARCHAR(64) not null,  -- 厂商
`price` DECIMAL(11,2) not null, -- 价格
`sales` INT(11) not null,  -- 销量
`stock` INT(11) not null,  -- 库存
`img_path` VARCHAR(256) not null  -- 照片路径
  -- 注意:不是单引号
);

SELECT * from  furn;


INSERT into furn(`id`,`name`,`maker`,`price`,`sales`,`stock`,`img_path`)
VALUES(null,'北欧风格小桌子','熊猫家居',100,666,7,'assets/images/producth')
INSERT into furn(`id`,`name`,`maker`,`price`,`sales`,`stock`,`img_path`)
VALUES(null,'简约风格小椅子','熊猫家居',200,666,7,'assets/images/producth')
INSERT into furn(`id`,`name`,`maker`,`price`,`sales`,`stock`,`img_path`)
VALUES(null,'典雅风格小桌子','蚂蚁家居',100,666,7,'assets/images/producth')
INSERT into furn(`id`,`name`,`maker`,`price`,`sales`,`stock`,`img_path`)
VALUES(null,'温馨风格小桌子','蚂蚁家居',100,666,7,'assets/images/producth')

导入相关的 jar 依赖。

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.rainbowsea</groupId>
    <artifactId>springboot_druid</artifactId>
    <version>1.0-SNAPSHOT</version>




    <!--    导入SpringBoot 父工程-规定写法-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.3</version>
    </parent>

    <!--    导入web项目场景启动器:会自动导入和web开发相关的jar包所有依赖【库/jar】-->
    <!--    后面还会在说明spring-boot-starter-web 到底引入哪些相关依赖-->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--引入lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--        进行数据库开发,引入 data-jdbc starter  spring boot 自带的数据库连接池
        HikariDataSource-->

        <!--        注意:
          spring boot 导入的该 jdbc  HikariDataSource 数据源
          1. HikariDataSource 数据源
          2. jdbc 数据链接
          3. tx  事务
          4. 注意:spring boot 并不能知道,你的项目想要操作的是什么数据库,
          所以你需要指定你想要的数据库,告诉spring boot 你想要连接的数据库

        -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>

        <!--
                1, 引入mysql 驱动,这里我们引入的是 8.0.26
                2. 这个mysql驱动的版本要和实际安装的mysql版本一致
                3. 我们的spring-boot mysql 区别仲裁版本是   <mysql.version>8.0.26</mysql.version>
                4. 这个mysql 驱动的版本,也可以在pom.xml properties 配置文件当中指定。
        -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <!--            <version>8.0.26</version>-->
        </dependency>

        <!--        如何开发springboot 测试类,我们需要引入  spring-boot-starter-test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

<!--        引入 druid 依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>

    </dependencies>


</project>

注意:这里我们需要导入的 Druild 的依赖

xml 复制代码
<!--        引入 druid 依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>

创建数据表 furn 映射在Java当中的 Bean 对象。这里我们使用了 lombok 插件进行。

java 复制代码
package com.rainbowsea.springboot.bean;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;

@Data
@AllArgsConstructor
@NoArgsConstructor  // 使用 lombok 插件进行自动配置
public class Furn {
    private Integer id;
    private String name;
    private String maker;
    private BigDecimal price;
    private  Integer sales;
    private  Integer stock;
    private String imgPath = "assets/images/product-image/1.jpg";
}

编写启动程序:

java 复制代码
package com.rainbowsea.springboot;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        ConfigurableApplicationContext ioc = SpringApplication.run(Application.class, args);

    }
}

我们需要在类路径下 resources 创建一个名为 application.yaml 文件,编写连接的数据库信息。

yaml 复制代码
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/spring_boot?useSSL=true&useUnicode=true&characterEncoding=UTF-8
    username: root
    password: MySQL123

这里我们通过定义配置类的方式 ------> 将Spring Boot 当中默认的 HikariDataSource 数据库连接池,换成是我们需要的 Druid数据库连接池

java 复制代码
package com.rainbowsea.springboot.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.SpringBootConfiguration;
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.sql.SQLException;
import java.util.Arrays;


@Configuration  // 标注配置类
public class DruidDataSourceConfig {

    // 编写方法,注入 DruidDataSource

    @Bean // 注入到 ioc 容器当中,没有指明名字,默认方法名就是 id/名称
    // 老师还有一个说明为什么我们注入自己DataSource,默认的HirKarDatasource失效的
    @ConfigurationProperties(value = "spring.datasource") // 该注解,让 application.yaml
    // 当中配置的信息,根据其后缀,将其配置到该类的属性 set()方法当中进行一个赋值操作。
    // 注入到 ioc 容器当中。
    public DataSource dataSource() throws SQLException {

        // 1.配置了 @ConfigurationProperties("spring.datasource")
        // 就可以读取到application.yaml的配置
        // 2.我们就不需要调用DruidDataSource 对象的setXX,会自动关联


        DruidDataSource druidDataSource = new DruidDataSource();
        //druidDataSource.setUrl();
        //druidDataSource.setUsername();
        //druidDataSource.setPassword();


        return druidDataSource;
    }


}

注意:对应的配置类,要加上 @Configuration 标注配置类。

  • @Bean // 注入到 ioc 容器当中,不然SpringBoot 无法使用,没有指明名字,默认方法名就是 id/名称
  • @ConfigurationProperties(value = "spring.datasource") // 该注解,让 application.yaml当中配置的信息,根据其后缀,将其配置到该类的属性 set()方法当中进行一个赋值操作。

运行测试,看看,我们是否成功切换数据库了。

为什么引入了 druid的依赖,就切换为了 Druid数据库连接池了

DataSourceAutoConfiguration.java 类。

java 复制代码
    @Configuration(
        proxyBeanMethods = false
    )
    @Conditional({DataSourceAutoConfiguration.PooledDataSourceCondition.class})
    @ConditionalOnMissingBean({DataSource.class, XADataSource.class})
    @Import({Hikari.class, Tomcat.class, Dbcp2.class, OracleUcp.class, Generic.class, DataSourceJmxConfiguration.class})
    protected static class PooledDataSourceConfiguration {
        protected PooledDataSourceConfiguration() {
        }
    }

@ConditionalOnMissingBean({DataSource.class, XADataSource.class}) // 默认的数据源是如配置?

解读通过: @ConditionalOnMissingBean({DataSource.class, XADataSource.class}) 判断如果容器有DataSource Bean 就不注入HiKariDatasource

3. Druid 监控功能

1.第一种方式是:在 web.xml 当中配置,需要在你web应用中的 WEB-INF/web.xml

根据配置中的url-pattern来访问内置监控页面,如果
https://github.com/alibaba/druid/wiki/配置_StatViewServlet配置

根据配置中的 url-pattern 来访问内置监控页面,如果是上面的配置,内置监控页面的首页是/druid/index.html

首先配置druid的监控页功能, 这里我们使用配置类的方式:注意:是 Servlet 注入的配置,和上次内容的 自定义 Servlet的注入。

java 复制代码
    // 配置druid的监控页功能, 注意:是 Servlet 注入的配置,和上次内容的 自定义 Servlet的注入
    @Bean // 注意要注入到 ioc 容器当中
    public ServletRegistrationBean staatViewServlet() {
        // 创建 StatViewServlet
        StatViewServlet statViewServlet = new StatViewServlet();
        ServletRegistrationBean<StatViewServlet>
                statViewServletServletRegistrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
        // statViewServlet, "/druid/*") 表示映射的路径

        // 设置 init-parameter,就是设置进入 Druid的账号和密码;
        statViewServletServletRegistrationBean.addInitParameter("loginUsername", "rainbowsea");
        statViewServletServletRegistrationBean.addInitParameter("loginPassword", "666");


        return statViewServletServletRegistrationBean;


    }
java 复制代码
package com.rainbowsea.springboot.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.SpringBootConfiguration;
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.sql.SQLException;
import java.util.Arrays;


@Configuration  // 标注配置类
public class DruidDataSourceConfig {

    // 编写方法,注入 DruidDataSource

    @Bean // 注入到 ioc 容器当中,没有指明名字,默认方法名就是 id/名称
    // 老师还有一个说明为什么我们注入自己DataSource,默认的HirKarDatasource失效的
    @ConfigurationProperties(value = "spring.datasource") // 该注解,让 application.yaml
    // 当中配置的信息,根据其后缀,将其配置到该类的属性 set()方法当中进行一个赋值操作。
    // 注入到 ioc 容器当中。
    public DataSource dataSource() throws SQLException {

        // 1.配置了 @ConfigurationProperties("spring.datasource")
        // 就可以读取到application.yaml的配置
        // 2.我们就不需要调用DruidDataSource 对象的setXX,会自动关联


        DruidDataSource druidDataSource = new DruidDataSource();
        //druidDataSource.setUrl();
        //druidDataSource.setUsername();
        //druidDataSource.setPassword();



        return druidDataSource;
    }


    // 配置druid的监控页功能, 注意:是 Servlet 注入的配置,和上次内容的 自定义 Servlet的注入
    @Bean // 注意要注入到 ioc 容器当中
    public ServletRegistrationBean staatViewServlet() {
        // 创建 StatViewServlet
        StatViewServlet statViewServlet = new StatViewServlet();
        ServletRegistrationBean<StatViewServlet>
                statViewServletServletRegistrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
        // statViewServlet, "/druid/*") 表示映射的路径

        // 设置 init-parameter,就是设置进入 Druid的账号和密码;
        statViewServletServletRegistrationBean.addInitParameter("loginUsername", "rainbowsea");
        statViewServletServletRegistrationBean.addInitParameter("loginPassword", "666");


        return statViewServletServletRegistrationBean;


    }


  
}

说明:

配置 druid 的监控页功能, 注意:是 Servlet 注入的配置,和上次内容的 自定义 Servlet的注入。

不要漏了 @Bean 注解注入到 ioc 容器当中,才能被Spring Boot 使用起来。



运行测试:

3.1 Druid 监控功能 ------ Web 关联监控

官方文档:https://github.com/alibaba/druid/wiki/配置_配置WebStatFilter

Druid 监控功能------> web 关联监控,是配置 WebStatFilter。从 WebStatFilter 见名之意,我们就明显的看出,这是一个 Filter 过滤器了。

java 复制代码
// 配置 WebStatFilter,用于采集 web-jdbc 关联的监控数据
    // 注意用的是 Filter 过滤器
    @Bean
    public FilterRegistrationBean webStatFilter() {

        // 创建 WebStatFilter ,
        WebStatFilter webStatFilter = new WebStatFilter();
        FilterRegistrationBean<WebStatFilter> webStatFilterFilterRegistrationBean = new FilterRegistrationBean<>(webStatFilter);

        // 默认对所有的url请求进行监控,
        // 表示过滤所有请求,Arrays.asList("/*") 将字符串转换为集合
        webStatFilterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));

        // 排除指定的url
        webStatFilterFilterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");


        return webStatFilterFilterRegistrationBean;

        /*
          <filter>
  	<filter-name>DruidWebStatFilter</filter-name>
  	<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
  	<init-param>
  		<param-name>exclusions</param-name>
  		<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>DruidWebStatFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
         */

    }
java 复制代码
package com.rainbowsea.springboot.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.SpringBootConfiguration;
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.sql.SQLException;
import java.util.Arrays;


@Configuration  // 标注配置类
public class DruidDataSourceConfig {

    // 编写方法,注入 DruidDataSource

    @Bean // 注入到 ioc 容器当中,没有指明名字,默认方法名就是 id/名称
    // 老师还有一个说明为什么我们注入自己DataSource,默认的HirKarDatasource失效的
    @ConfigurationProperties(value = "spring.datasource") // 该注解,让 application.yaml
    // 当中配置的信息,根据其后缀,将其配置到该类的属性 set()方法当中进行一个赋值操作。
    // 注入到 ioc 容器当中。
    public DataSource dataSource() throws SQLException {

        // 1.配置了 @ConfigurationProperties("spring.datasource")
        // 就可以读取到application.yaml的配置
        // 2.我们就不需要调用DruidDataSource 对象的setXX,会自动关联


        DruidDataSource druidDataSource = new DruidDataSource();
        //druidDataSource.setUrl();
        //druidDataSource.setUsername();
        //druidDataSource.setPassword();


       
        return druidDataSource;
    }

    // 配置 WebStatFilter,用于采集 web-jdbc 关联的监控数据
    // 注意用的是 Filter 过滤器
    @Bean
    public FilterRegistrationBean webStatFilter() {

        // 创建 WebStatFilter ,
        WebStatFilter webStatFilter = new WebStatFilter();
        FilterRegistrationBean<WebStatFilter> webStatFilterFilterRegistrationBean = new FilterRegistrationBean<>(webStatFilter);

        // 默认对所有的url请求进行监控,
        // 表示过滤所有请求,Arrays.asList("/*") 将字符串转换为集合
        webStatFilterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));

        // 排除指定的url
        webStatFilterFilterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");


        return webStatFilterFilterRegistrationBean;

        /*
          <filter>
  	<filter-name>DruidWebStatFilter</filter-name>
  	<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
  	<init-param>
  		<param-name>exclusions</param-name>
  		<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>DruidWebStatFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
         */

    }


    



}

说明:


运行测试:

3.2 Druid 监控功能 ------ SQL监控

官网地址:https://github.com/alibaba/druid/wiki/配置-wallfilter

// 将数据库连接池加入到 druid监视当中

druidDataSource.setFilters("stat");

只需要在配置 DataSource数据源时,添加如下代码即可。druidDataSource.setFilters("stat")

java 复制代码
 druidDataSource.setFilters("stat");
java 复制代码
// 编写方法,注入 DruidDataSource

    @Bean // 注入到 ioc 容器当中,没有指明名字,默认方法名就是 id/名称
    // 老师还有一个说明为什么我们注入自己DataSource,默认的HirKarDatasource失效的
    @ConfigurationProperties(value = "spring.datasource") // 该注解,让 application.yaml
    // 当中配置的信息,根据其后缀,将其配置到该类的属性 set()方法当中进行一个赋值操作。
    // 注入到 ioc 容器当中。
    public DataSource dataSource() throws SQLException {

        // 1.配置了 @ConfigurationProperties("spring.datasource")
        // 就可以读取到application.yaml的配置
        // 2.我们就不需要调用DruidDataSource 对象的setXX,会自动关联
        DruidDataSource druidDataSource = new DruidDataSource();

        // 将数据库连接池加入到 druid监视当中
        druidDataSource.setFilters("stat");

        return druidDataSource;
    }
java 复制代码
package com.rainbowsea.springboot.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.SpringBootConfiguration;
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.sql.SQLException;
import java.util.Arrays;


@Configuration  // 标注配置类
public class DruidDataSourceConfig {

    // 编写方法,注入 DruidDataSource

    @Bean // 注入到 ioc 容器当中,没有指明名字,默认方法名就是 id/名称
    // 老师还有一个说明为什么我们注入自己DataSource,默认的HirKarDatasource失效的
    @ConfigurationProperties(value = "spring.datasource") // 该注解,让 application.yaml
    // 当中配置的信息,根据其后缀,将其配置到该类的属性 set()方法当中进行一个赋值操作。
    // 注入到 ioc 容器当中。
    public DataSource dataSource() throws SQLException {

        // 1.配置了 @ConfigurationProperties("spring.datasource")
        // 就可以读取到application.yaml的配置
        // 2.我们就不需要调用DruidDataSource 对象的setXX,会自动关联
        DruidDataSource druidDataSource = new DruidDataSource();

        // 将数据库连接池加入到 druid监视当中
        druidDataSource.setFilters("stat");

        return druidDataSource;
    }

    // 配置 WebStatFilter,用于采集 web-jdbc 关联的监控数据
    // 注意用的是 Filter 过滤器
    @Bean
    public FilterRegistrationBean webStatFilter() {

        // 创建 WebStatFilter ,
        WebStatFilter webStatFilter = new WebStatFilter();
        FilterRegistrationBean<WebStatFilter> webStatFilterFilterRegistrationBean = new FilterRegistrationBean<>(webStatFilter);

        // 默认对所有的url请求进行监控,
        // 表示过滤所有请求,Arrays.asList("/*") 将字符串转换为集合
        webStatFilterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));

        // 排除指定的url
        webStatFilterFilterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");


        return webStatFilterFilterRegistrationBean;

        /*
          <filter>
  	<filter-name>DruidWebStatFilter</filter-name>
  	<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
  	<init-param>
  		<param-name>exclusions</param-name>
  		<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>DruidWebStatFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
         */

    }


    // 配置druid的监控页功能, 注意:是 Servlet 注入的配置,和上次内容的 自定义 Servlet的注入
    @Bean // 注意要注入到 ioc 容器当中
    public ServletRegistrationBean staatViewServlet() {
        // 创建 StatViewServlet
        StatViewServlet statViewServlet = new StatViewServlet();
        ServletRegistrationBean<StatViewServlet>
                statViewServletServletRegistrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
        // statViewServlet, "/druid/*") 表示映射的路径

        // 设置 init-parameter,就是设置进入 Druid的账号和密码;
        statViewServletServletRegistrationBean.addInitParameter("loginUsername", "rainbowsea");
        statViewServletServletRegistrationBean.addInitParameter("loginPassword", "666");


        return statViewServletServletRegistrationBean;


    }



}

我们编写一个 执行 Sql 语句的,控制 Controller 进行一个,测试

java 复制代码
package com.rainbowsea.springboot.controller;


import com.rainbowsea.springboot.bean.Furn;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import java.util.List;

@Controller
public class DruidSqlController {

    @Resource
    private JdbcTemplate jdbcTemplate;

    @ResponseBody
    @GetMapping("/sql")
    public List<Furn> crudDB() {
        BeanPropertyRowMapper<Furn> rowMapper = new BeanPropertyRowMapper<>(Furn.class);
        List<Furn> furns = jdbcTemplate.query("select * from furn", rowMapper);

        for (Furn furn : furns) {
            System.out.println(furn);
        }


        return furns;


    }



}

运行测试:

3.3 Druid 监控功能 ------ SQL防火墙

官网地址:https://github.com/alibaba/druid/wiki/配置-wallfilter

我们只需要在上面 配置 Druid监控功能的------SQL监控的基础的数据源的后面加上 wall 即可。

java 复制代码
 druidDataSource.setFilters("stat,wall");
java 复制代码
@Configuration  // 标注配置类
public class DruidDataSourceConfig {

    // 编写方法,注入 DruidDataSource

    @Bean // 注入到 ioc 容器当中,没有指明名字,默认方法名就是 id/名称
    // 老师还有一个说明为什么我们注入自己DataSource,默认的HirKarDatasource失效的
    @ConfigurationProperties(value = "spring.datasource") // 该注解,让 application.yaml
    // 当中配置的信息,根据其后缀,将其配置到该类的属性 set()方法当中进行一个赋值操作。
    // 注入到 ioc 容器当中。
    public DataSource dataSource() throws SQLException {

        // 1.配置了 @ConfigurationProperties("spring.datasource")
        // 就可以读取到application.yaml的配置
        // 2.我们就不需要调用DruidDataSource 对象的setXX,会自动关联

        DruidDataSource druidDataSource = new DruidDataSource();

        // 将数据库连接池加入到 druid监视当中
        // wall ,将数据库连接池加入sql防火墙
        druidDataSource.setFilters("stat,wall");

        return druidDataSource;
    }
}
java 复制代码
package com.rainbowsea.springboot.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.SpringBootConfiguration;
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.sql.SQLException;
import java.util.Arrays;


@Configuration  // 标注配置类
public class DruidDataSourceConfig {

    // 编写方法,注入 DruidDataSource

    @Bean // 注入到 ioc 容器当中,没有指明名字,默认方法名就是 id/名称
    // 老师还有一个说明为什么我们注入自己DataSource,默认的HirKarDatasource失效的
    @ConfigurationProperties(value = "spring.datasource") // 该注解,让 application.yaml
    // 当中配置的信息,根据其后缀,将其配置到该类的属性 set()方法当中进行一个赋值操作。
    // 注入到 ioc 容器当中。
    public DataSource dataSource() throws SQLException {

        // 1.配置了 @ConfigurationProperties("spring.datasource")
        // 就可以读取到application.yaml的配置
        // 2.我们就不需要调用DruidDataSource 对象的setXX,会自动关联

        DruidDataSource druidDataSource = new DruidDataSource();

        // 将数据库连接池加入到 druid监视当中
        // wall ,将数据库连接池加入sql防火墙
        druidDataSource.setFilters("stat,wall");

        return druidDataSource;
    }

    // 配置 WebStatFilter,用于采集 web-jdbc 关联的监控数据
    // 注意用的是 Filter 过滤器
    @Bean
    public FilterRegistrationBean webStatFilter() {

        // 创建 WebStatFilter ,
        WebStatFilter webStatFilter = new WebStatFilter();
        FilterRegistrationBean<WebStatFilter> webStatFilterFilterRegistrationBean = new FilterRegistrationBean<>(webStatFilter);

        // 默认对所有的url请求进行监控,
        // 表示过滤所有请求,Arrays.asList("/*") 将字符串转换为集合
        webStatFilterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));

        // 排除指定的url
        webStatFilterFilterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");


        return webStatFilterFilterRegistrationBean;

        /*
          <filter>
  	<filter-name>DruidWebStatFilter</filter-name>
  	<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
  	<init-param>
  		<param-name>exclusions</param-name>
  		<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>DruidWebStatFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
         */

    }


    // 配置druid的监控页功能, 注意:是 Servlet 注入的配置,和上次内容的 自定义 Servlet的注入
    @Bean // 注意要注入到 ioc 容器当中
    public ServletRegistrationBean staatViewServlet() {
        // 创建 StatViewServlet
        StatViewServlet statViewServlet = new StatViewServlet();
        ServletRegistrationBean<StatViewServlet>
                statViewServletServletRegistrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
        // statViewServlet, "/druid/*") 表示映射的路径

        // 设置 init-parameter,就是设置进入 Druid的账号和密码;
        statViewServletServletRegistrationBean.addInitParameter("loginUsername", "rainbowsea");
        statViewServletServletRegistrationBean.addInitParameter("loginPassword", "666");


        return statViewServletServletRegistrationBean;


    }



}

运行测试:

3.4 Druid 监控功能 ------ Session 监控

默认 Session 监视就是开启的。但是 Druid 只会监控,本项目(localhost)的Session 的内容,其它的项目的Session 是不会被监控的。

4. Druid Spring Boot Starter

前面我们使用的是自己引入druid+配置类方式整合Druid和监控

Druid Spring Boot Starter 可以让程序员在SpringBoot项目中更加轻松集成Druid和监控。

对应Druid Spring Boot Starter 的配置,我们只需要在 类路径(resources)下创建application.yaml 配置文件,同时在其中配置好,对应的 Druid 监控功能。

我们还是使用上面测试过的 Furn 数据表,进行测试演示。

java 复制代码
package com.rainbowsea.springboot.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;

@Data
@NoArgsConstructor  // 空构造器
@AllArgsConstructor  // 全参数构造器  lombok
public class Furn {
    private Integer id;
    private String name;
    private String maker;
    private BigDecimal price;
    private  Integer sales;
    private  Integer stock;
    private String imgPath = "assets/images/product-image/1.jpg";
}

编写对应的执行 Sql 语句测试的 ,Controller 控制器

java 复制代码
package com.rainbowsea.springboot.controller;


import com.rainbowsea.springboot.bean.Furn;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import java.util.List;

@Controller
public class DruidSqlController {


    @Resource
    private JdbcTemplate jdbcTemplate;



    @ResponseBody
    @GetMapping(value = "/sql")
    public List<Furn> crudDB() {
        BeanPropertyRowMapper<Furn> rowMapper = new BeanPropertyRowMapper<>(Furn.class);

        List<Furn> furns = jdbcTemplate.query("select * from furn", rowMapper);

        for (Furn furn : furns) {
            System.out.println(furn);
        }

        return furns;
    }
}

编写场景启动器:

java 复制代码
package com.rainbowsea.springboot;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        ConfigurableApplicationContext ioc = SpringApplication.run(Application.class, args);

    }
}

applicaiton.yaml 文件中编写,我们的连接的数据库,以及 Druid数据源,以及Druid监控功能的配置

注意:因为我们的Spring Boot 是默认就会读取 resources 类路径下的 application.yaml 文件当中的信息的,从而配置到对应的类属性值上,所以,我们不需要,额外的配置,让Spring Boot读取到 application.yaml的配置,Spring Boot 默认就会自行去读取里面文件当中的内容

yaml 复制代码
spring:
  datasource:
    password: MySQL123
    username: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/spring_boot?useSSL=true&useUnicode=true&characterEncoding=UTF-8

    # 配置 druid 和监控功能
    druid:
      stat-view-servlet:
        enabled: true # 启用
        login-username: rainbowsea  # 用户名
        login-password: 123   # 密码
        reset-enable: false  # true 表示开启  druid 监控功能

      # 配置 Web监控
      web-stat-filter:
        enabled: true  # 启用
        url-pattern: /*  # 监视所有
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"  # 排除过滤不监视的内容

      # 配置 sql监控 和 SQl防火墙,都是在过滤器当中的
      filter:
        stat: # sql监控
          slow-sql-millis: 1000
          log-slow-sql: true
          enabled: true # 开启
          # 配置 SQl 防火墙
        wall:
          config:
            alter-table-allow: false
#            select-all-column-allow: false
            drop-table-allow: false
          enabled: true

运行测试:

5. 总结:

  1. Druid 的官方文档:官方文档 :https://github.com/alibaba/druid
  2. Druid:性能优秀,Druid提供的监控功能外{Java基础},还集成了SQL监控。可以清楚知道连接池和 SQL的工作情况。所以根据项目需要,我们也要掌握Druid和SpringBoot整合。
  3. Druid:性能优秀,Druid提供的监控功能外{Java基础},还集成了SQL监控。可以清楚知道连接池和 SQL的工作情况。所以根据项目需要,我们也要掌握Druid和SpringBoot整合。
  4. 根据配置中的 url-pattern 来访问内置监控页面,如果是上面的配置,内置监控页面的首页是/druid/index.html
  5. 开启 Druid 监控功能的------ StatViewServlet 的 Servlet 。
  6. Druid 监控功能的 ------ Web 关联监控,是 WebStatFilter
  7. Druid 监控的功能------ SQL 监控是,WebStatFilter
  8. 在 Druid 监控功能当中,Session监控是默认开启的。但是 Druid 只会监控,本项目(localhost)的Session 的内容,其它的项目的Session 是不会被监控的。
  9. 对应Druid Spring Boot Starter 的配置,我们只需要在 类路径(resources)下创建application.yaml 配置文件,同时在其中配置好,对应的 Druid 监控功能。
    1. 注意:因为我们的Spring Boot 是默认就会读取 resources 类路径下的 application.yaml 文件当中的信息的,从而配置到对应的类属性值上,所以,我们不需要,额外的配置,让Spring Boot读取到 application.yaml的配置,Spring Boot 默认就会自行去读取里面文件当中的内容

6. 最后:

"在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。"

相关推荐
码路飞16 分钟前
GPT-5.3 Instant 终于学会好好说话了,顺手对比了下同天发布的 Gemini 3.1 Flash-Lite
java·javascript
序安InToo19 分钟前
第6课|注释与代码风格
后端·操作系统·嵌入式
xyy12319 分钟前
C#: Newtonsoft.Json 到 System.Text.Json 迁移避坑指南
后端
洋洋技术笔记22 分钟前
Spring Boot Web MVC配置详解
spring boot·后端
JxWang0522 分钟前
VS Code 配置 Markdown 环境
后端
navms25 分钟前
搞懂线程池,先把 Worker 机制啃明白
后端
JxWang0525 分钟前
离线数仓的优化及重构
后端
Nyarlathotep011326 分钟前
gin01:初探gin的启动
后端·go
JxWang0527 分钟前
安卓手机配置通用多屏协同及自动化脚本
后端
JxWang0528 分钟前
Windows Terminal 配置 oh-my-posh
后端