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

news2024/9/21 22:19:32

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

文章目录

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


1. Druid 的基本介绍

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

在这里插入图片描述

https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98

在这里插入图片描述

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

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

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

  1. 自定义方式

  2. 引入 starter 方式

2. 准备工作:

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

# 创建 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 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 的依赖

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

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

在这里插入图片描述

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";
}

编写启动程序:

在这里插入图片描述

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 文件,编写连接的数据库信息。

在这里插入图片描述

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数据库连接池

在这里插入图片描述

在这里插入图片描述

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 类。

在这里插入图片描述


    @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/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE

在这里插入图片描述

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

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

在这里插入图片描述

    // 配置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;


    }
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/%E9%85%8D%E7%BD%AE_%E9%85%8D%E7%BD%AEWebStatFilter

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

在这里插入图片描述

在这里插入图片描述

// 配置 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>
         */

    }
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/%E9%85%8D%E7%BD%AE-wallfilter

在这里插入图片描述

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

在这里插入图片描述

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

 druidDataSource.setFilters("stat");
// 编写方法,注入 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;
    }
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 进行一个,测试

在这里插入图片描述

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/%E9%85%8D%E7%BD%AE-wallfilter

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

 druidDataSource.setFilters("stat,wall");

@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;
    }
}
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 数据表,进行测试演示。

在这里插入图片描述

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 控制器

在这里插入图片描述

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;
    }
}

编写场景启动器:

在这里插入图片描述

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 默认就会自行去读取里面文件当中的内容

在这里插入图片描述

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. 最后:

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2141858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数组学习内容

动态初始化 只给长度&#xff0c;数据类型【】 数组名new 数据类型【数组长度】 内存图

MySQL篇(数值函数/)(持续更新迭代)

目录 常见函数一&#xff1a;数值函数 一、常见数值函数 1. 基本函数 2. 角度与弧度互换函数 3. 三角函数 4. 指数与对数 5. 进制间的转换 常见函数二&#xff1a;日期函数 一、常见日期函数 二、SQL演示 1. curdate&#xff1a;当前日期 2. curtime&#xff1a;当前…

ThreadX源码:Cortex-A7的tx_thread_context_save.S(线程上下文保存)汇编代码分析

0 参考资料 Cortex M3权威指南(中文).pdf&#xff08;可以参考ARM指令集用法&#xff09; 1 前言 tx_thread_context_save.S是用来实现Cortex-A7下线程上下文保存的函数所在汇编文件。 2 源码分析 2.1 概述 _tx_thread_context_save函数用于在线程被中断打断后保存上下文&a…

「Next.js中文文档」网站发布

大家好&#xff0c;我是程普&#xff08;weijunext&#xff09;&#xff0c;我联合“阿伟dev”搭建了一个「Next.js 中文文档」网站&#x1f447; 这个网站我们设计得很特别&#xff1a; 样式很特别 我们模仿 Next.js 官方网站样式&#xff0c;努力做到除了语言不同&#xff…

进程相关的系统调用

文章目录 进程进程相关的系统调用wait函数waitpid函数示例--使用wait fork函数创建子进程并使用宏验证子进程的退出状态信息示例--使用waitpid函数检测子进程是否进入暂停状态 exec族函数示例--exec族函数的使用 system函数示例--使用system函数执行外部指令 进程状态切换 进程…

Vue2电商平台项目 (三) Search模块、面包屑(页面自己跳自己)、排序、分页器!

文章目录 一、Search模块1、Search模块的api2、Vuex保存数据3、组件获取vuex数据并渲染(1)、分析请求数据的数据结构(2)、getters简化数据、渲染页面 4、Search模块根据不同的参数获取数据(1)、 派发actions的操作封装为函数(2)、设置带给服务器的参数(3)、Object.assign整理参…

第十一章 【后端】商品分类管理微服务(11.1)——创建父工程

第十一章 【后端】商品分类管理微服务 11.1 创建父工程 项目名称:EasyTradeManagerSystem:Easy 表示简单易用,Trade 表示交易,Manager 表示管理,System 表示系统,强调系统在商品交易管理方面的便捷性,简称 etms。 新建工程 yumi-etms yumi-etms 作为所有模块的父工程,…

基于java 的医院排号管理系统设计与实现

博主介绍&#xff1a;专注于Java .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的可以…

1863. 找出所有子集的异或总和再求和

目录 一&#xff1a;题目&#xff1a; 二&#xff1a;代码&#xff1a; 三&#xff1a;结果&#xff1a; 一&#xff1a;题目&#xff1a; 一个数组的 异或总和 定义为数组中所有元素按位 XOR 的结果&#xff1b;如果数组为 空 &#xff0c;则异或总和为 0 。 例如&#x…

C++--类的实例化

一、实例化的概念 用类类型在屋里内存中创建对象的过程&#xff0c;称为类实例化出对象 类是对对象进行一种抽象描述&#xff0c;是一个模型一样的东西&#xff0c;限定了类有哪些成员变量&#xff0c;这些成员变量只是声明&#xff0c;没有分配空间&#xff0c;用类实例化出…

【C++前后缀分解 动态规划】2100. 适合野炊的日子|1702

本文涉及知道点 C前后缀分解 C动态规划 LeetCode2100. 适合野炊的日子 你和朋友们准备去野炊。给你一个下标从 0 开始的整数数组 security &#xff0c;其中 security[i] 是第 i 天的建议出行指数。日子从 0 开始编号。同时给你一个整数 time 。 如果第 i 天满足以下所有条件…

2024最新版MySQL详细学习教程

MySQL数据库提供了很多函数包括&#xff1a; 数学函数&#xff1b;字符串函数&#xff1b;日期和时间函数&#xff1b;条件判断函数&#xff1b;系统信息函数&#xff1b;加密函数&#xff1b;格式化函数&#xff1b; 一、数学函数 数学函数主要用于处理数字&#xff0c;包括…

基于paddleocr的批量图片缩放识别

说明 在进行ocr文字识别的时候&#xff0c;有时候我们需要使用批量测试的功能&#xff0c;但是有些图片会识别失败或者个别根本识别不出来&#xff0c;这时候我们可以通过对原图片进行缩放&#xff0c;提高图像的分辨率&#xff0c;然后再次识别&#xff0c;这样可以大大提高图…

Vue学习记录之一(介绍及脚手架的使用)

一、背景知识介绍 1、构建工具介绍 Vite, Webpack,Rollup, Parce 构建工具优点缺点Vite- 快速启动&#xff0c;秒级热更新&#xff0c;更快的构建速度&#xff0c;更好的开发体验&#xff1b;- 支持 Vue3 和 ES modules 的原生特性&#xff0c;轻松实现按需加载。- 对于单页…

项目实现:云备份②(文件操作、Json等工具类的实现)

云备份 前言文件操作实用工具类设计文件属性的获取文件的读写操作文件压缩与解压缩的实现文件目录操作 Json 实用工具类设计编译优化 前言 如果有老铁不知道当前项目实现的功能是什么的话&#xff0c;可以先移步这篇文章内容&#xff1a; 云备份项目的介绍 其中介绍了云备份项…

【吊打面试官系列-MySQL面试题】简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别?

大家好&#xff0c;我是锋哥。今天分享关于【简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别&#xff1f; MyISAM&#xff1a; 不支持事务&#xff0c;但是每次查…

跳出大厂圈子——普通程序员如何开启逆袭之路

时间&#xff1a;2024年09月16日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 音频&#xff1a;喜马拉雅 大家好&#xff0c;欢迎来到“小蒋聊技术”&#xff01;今天咱们聊点特别现实的事儿——普通程序员的出路。互联网时代…

化学实验室器具识别系统源码分享

化学实验室器具识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

android设置实现广告倒计时功能

文章目录 CountDownTimer基本使用增加基础BaseActivity增加固定活动 在Android中&#xff0c;CountDownTimer 是一个用于计时的类&#xff0c;它允许你在指定的时间段内执行某些操作。通常用于倒计时功能&#xff0c;例如显示一个倒计时进度条或者在倒计时结束后执行某个动作。…

采用qt做一个命令行终端

qt做一个类似系统命令行终端的工具&#xff0c;方便集成到自己的软件里使用&#xff0c;这样能保证软件的整体性&#xff0c;而且是真正的做到和系统命令行终端一样的交互方式&#xff0c;而不是单独搞个编辑框的方式输入命令&#xff08;大部分博客都是做成这个样子&#xff0…