十六,Spring Boot 整合 Druid 以及使用 Druid 监控功能
官方文档HiKariCP:是目前市场上非常优秀的数据源,是 Spring Boot2默认数据源。关于这一点的测试,大家可以移步至 ✏️✏️✏️十五,Spring Boot 整合连接数据库(详细配置)-CSDN博客Druid:性能优秀,Druid提供的监控功能外{Java基础},还集成了SQL监控。可以清楚知道连接池和 SQL的工作情况。所以根据项目需要,我们也要掌握Druid和SpringBoot
十六,Spring Boot 整合 Druid 以及使用 Druid 监控功能
文章目录
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方式:两种方式:
-
自定义方式
-
引入 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. 总结:
- Druid 的官方文档:官方文档 :https://github.com/alibaba/druid
- Druid:性能优秀,Druid提供的监控功能外{Java基础},还集成了SQL监控。可以清楚知道连接池和 SQL的工作情况。所以根据项目需要,我们也要掌握Druid和SpringBoot整合。
- Druid:性能优秀,Druid提供的监控功能外{Java基础},还集成了SQL监控。可以清楚知道连接池和 SQL的工作情况。所以根据项目需要,我们也要掌握Druid和SpringBoot整合。
- 根据配置中的
url-pattern
来访问内置监控页面,如果是上面的配置,内置监控页面的首页是/druid/index.html
。 - 开启 Druid 监控功能的——
StatViewServlet
的 Servlet 。 - Druid 监控功能的 —— Web 关联监控,是
WebStatFilter
- Druid 监控的功能—— SQL 监控是,
WebStatFilter
- 在 Druid 监控功能当中,Session监控是默认开启的。但是 Druid 只会监控,本项目(localhost)的Session 的内容,其它的项目的Session 是不会被监控的。
- 对应Druid Spring Boot Starter 的配置,我们只需要在 类路径(resources)下创建
application.yaml
配置文件,同时在其中配置好,对应的 Druid 监控功能。- 注意:因为我们的Spring Boot 是默认就会读取 resources 类路径下的 application.yaml 文件当中的信息的,从而配置到对应的类属性值上,所以,我们不需要,额外的配置,让Spring Boot读取到 application.yaml的配置,Spring Boot 默认就会自行去读取里面文件当中的内容 。
6. 最后:
“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)