当前位置: 首页 > news >正文

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

十六,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_bootUSE 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.262. 这个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.Driverurl: jdbc:mysql://localhost:3306/spring_boot?useSSL=true&useUnicode=true&characterEncoding=UTF-8username: rootpassword: 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() {// 创建 StatViewServletStatViewServlet 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() {// 创建 StatViewServletStatViewServlet 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 过滤器@Beanpublic FilterRegistrationBean webStatFilter() {// 创建 WebStatFilter ,WebStatFilter webStatFilter = new WebStatFilter();FilterRegistrationBean<WebStatFilter> webStatFilterFilterRegistrationBean = new FilterRegistrationBean<>(webStatFilter);// 默认对所有的url请求进行监控,// 表示过滤所有请求,Arrays.asList("/*") 将字符串转换为集合webStatFilterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));// 排除指定的urlwebStatFilterFilterRegistrationBean.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 过滤器@Beanpublic FilterRegistrationBean webStatFilter() {// 创建 WebStatFilter ,WebStatFilter webStatFilter = new WebStatFilter();FilterRegistrationBean<WebStatFilter> webStatFilterFilterRegistrationBean = new FilterRegistrationBean<>(webStatFilter);// 默认对所有的url请求进行监控,// 表示过滤所有请求,Arrays.asList("/*") 将字符串转换为集合webStatFilterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));// 排除指定的urlwebStatFilterFilterRegistrationBean.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 过滤器@Beanpublic FilterRegistrationBean webStatFilter() {// 创建 WebStatFilter ,WebStatFilter webStatFilter = new WebStatFilter();FilterRegistrationBean<WebStatFilter> webStatFilterFilterRegistrationBean = new FilterRegistrationBean<>(webStatFilter);// 默认对所有的url请求进行监控,// 表示过滤所有请求,Arrays.asList("/*") 将字符串转换为集合webStatFilterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));// 排除指定的urlwebStatFilterFilterRegistrationBean.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() {// 创建 StatViewServletStatViewServlet 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 {@Resourceprivate 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 过滤器@Beanpublic FilterRegistrationBean webStatFilter() {// 创建 WebStatFilter ,WebStatFilter webStatFilter = new WebStatFilter();FilterRegistrationBean<WebStatFilter> webStatFilterFilterRegistrationBean = new FilterRegistrationBean<>(webStatFilter);// 默认对所有的url请求进行监控,// 表示过滤所有请求,Arrays.asList("/*") 将字符串转换为集合webStatFilterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));// 排除指定的urlwebStatFilterFilterRegistrationBean.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() {// 创建 StatViewServletStatViewServlet 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 {@Resourceprivate 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: MySQL123username: rootdriver-class-name: com.mysql.cj.jdbc.Driverurl: 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: 1000log-slow-sql: trueenabled: true # 开启# 配置 SQl 防火墙wall:config:alter-table-allow: false
#            select-all-column-allow: falsedrop-table-allow: falseenabled: 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. 最后:

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

在这里插入图片描述

相关文章:

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

十六&#xff0c;Spring Boot 整合 Druid 以及使用 Druid 监控功能 文章目录 十六&#xff0c;Spring Boot 整合 Druid 以及使用 Druid 监控功能1. Druid 的基本介绍2. 准备工作&#xff1a;3. Druid 监控功能 3.1 Druid 监控功能 —— Web 关联监控3.2 Druid 监控功能 —— …...

Python办公—DataMatrix二维条码制作

目录 专栏导读1、库的介绍2、库的安装3、核心代码4、完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动化专…...

Linux:软硬链接

目录 一、概念 软链接 硬链接 二、原理 硬链接 软链接 三、使用场景 硬链接 软链接 一、概念 软链接 在当前目录下&#xff0c;有一个普通文件a.txt。 ln -s a.txt a_soft.link结论&#xff1a; 软链接是一个文件。 观察inode_id&#xff0c;发现软链接有着独立…...

[笔记] Windows 上 Git 安装详细教程:从零开始,附带每个选项解析

Git 是目前最流行的分布式版本控制系统之一&#xff0c;广泛应用于软件开发和项目管理中。对于 Windows 用户来说&#xff0c;正确安装和配置 Git 是开始使用 Git 的第一步。本文提供一份详细的指南&#xff0c;帮助你在 Windows 系统上顺利安装 Git&#xff0c;并解释每个安装…...

23种设计模式之策略模式

目录 1. 简介2. 代码2.1 Strategy &#xff08;策略接口&#xff09;2.2 AddStrategy &#xff08;具体策略类&#xff09;2.3 SubStrategy &#xff08;具体策略类&#xff09;2.4 MultiplyStrategy &#xff08;具体策略类&#xff09;2.5 Operation &#xff08;上下文类&am…...

总篇:Python3+Request+Pytest+Allure+Jenkins接口自动化框架设计思路

1、技术选型 Python3 Python 是一种广泛使用的高级编程语言,具有简洁、易读、易维护的特点。 Python 拥有丰富的第三方库,可以方便地进行接口测试的开发。 Request Request 是一个强大的 HTTP 库,用于发送 HTTP 请求和处理响应。 Request 支持多种 HTTP 方法,如 GET、P…...

【QML】release版本bug,信号的参数无法获取

1. 现象 问题 QML程序在debug编译模式下程序可以正常运行&#xff0c;但是release版本下报错&#xff1a;ReferenceError: para is not defined版本 Qt creator 10.0.2Qt_5_15_2_MinGW 平台 win 10 2. 解决方法 暂时没有找到好的解决办法&#xff0c;只能规避规避方法 //问…...

Javaweb 前端 ajax

作用&#xff1a;和后端交互 script 是 js axios(这里是函数的调用方式){封装的是对象} {}是对象 案例 。then的含义&#xff0c;请求后端之后&#xff0c;后端把数据放在回调 点了清空之后&#xff0c;还要查询全部 await等待请求执行完之后&#xff0c;接收这个结果 代码…...

汽车EEA架构:发展历程

1.发展历程的基本逻辑 汽车电子电气的发展历程中&#xff0c;其使用的基本逻辑是IPO(Input-Processing-Output)模型&#xff0c;如下图1所示&#xff1a; 图 1 那什么是IPO模型了&#xff1f;我们从控制器的原理入手解释IPO模型,控制器的主要用途如下&#xff1a; 根据给定的逻…...

几个Linux系统安装体验: 统信服务器系统

本文介绍统信服务器系统&#xff08;UOS&#xff09;的安装。 下载 下载地址&#xff1a; https://www.chinauos.com/resource/download-server 本文下载的文件名称为uos-server-20-1070e-amd64.iso。 安装 本次实践仅是做测试体验&#xff0c;因此在pc上使用虚拟机vmware…...

用二维图像渲染3D场景视频

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…...

ChatGPT 最新推出的 Pro 订阅计划,具备哪些能力 ?

OpenAI 最近推出了 ChatGPT Pro&#xff0c;这是一个每月收费 200 美元的高级订阅计划&#xff0c;旨在为用户提供对 OpenAI 最先进模型和功能的高级访问。 以下是 ChatGPT Pro 的主要功能和能力&#xff1a; 高级模型访问&#xff1a; o1 模型&#xff1a;包括 o1 和 o1 Pro…...

如何在 IntelliJ IDEA 中为 Spring Boot 应用实现热部署

文章目录 1. 引言2. 准备工作3. 添加必要的依赖4. 配置 IntelliJ IDEA4.1 启用自动编译4.2 开启热部署策略 5. 测试热部署6. 高级技巧7. 注意事项8. 总结 随着现代开发工具的进步&#xff0c;开发者们越来越重视提高生产力的特性。对于 Java 开发者来说&#xff0c;能够在不重启…...

NLP与LLM的工程化实践与学习思考 - 写在开头

NLP与LLM的工程化实践与学习思考[24年半年工作总结] - 写在开头 0 开头的开头 0 开头的开头 24年因为一些工作原因&#xff0c;短暂在NLP领域遨游了半年。这半年对我的影响蛮大&#xff0c;一来是因为此前从没接触过这个方向学到新东西挺开心的&#xff0c;二来是在工程化实践…...

Redis(一)

Redis 基础 什么是 Redis&#xff1f; Redis &#xff08;REmote DIctionary Server&#xff09;是一个基于 C 语言开发的开源 NoSQL 数据库&#xff08;BSD 许可&#xff09;。与传统数据库不同的是&#xff0c;Redis 的数据是保存在内存中的&#xff08;内存数据库&#xf…...

RocketMq源码-broker(五)

一、RocketMq存储设计 RocketMQ 主要存储的文件包括Commitlog 文件、ConsumeQueue 文件、IndexFile。RocketMQ 将所有主题的消息存储在同一文件&#xff0c;确保消息发送时顺序写文件&#xff0c;尽最大的能力确保消息发送的高性能与高吞吐量。 但由于一般的消息中间件是基于消…...

【Linux】文件描述符fd

1.前置预备 文件 内容 属性访问文件之前&#xff0c;都必须先打开他 #include<stdio.h> int main() { FILE* fpfopen("log.txt","w"); if(fpNULL) { perror("fopen"); return 1; } fclose(fp); return 0…...

mysql之事务

MySQL的事务隔离特性指的是多个并发事务之间相互隔离的程度&#xff0c;以保证数据的一致性和并发性。MySQL支持四个隔离级别&#xff0c;分别是读未提交&#xff08;Read Uncommitted&#xff09;、读已提交&#xff08;Read Committed&#xff09;、可重复读&#xff08;Repe…...

python插入mysql数据

# 插入与上一篇变化不大,只是需要进行确认操作. 增加确认操作的方法有两种&#xff08;假设类对象为a&#xff09;: 1.在连接时传入一个参数:autocommitTrue aConnection&#xff08; host"localhost", port3306, user"root", password"自己的密码…...

C语言面试题/笔试题/高频面试题

一、C&#xff1a; 1.static和const的作用优缺点 限制作用域&#xff1a; static声明中使用全局变量、函数 &#xff0c;仅当前文件内可用&#xff0c;其他文件不能引用 static修饰的局部变量只能在本函数中使用. 延长生命周期: static修饰的变量生命周期为整个程序 存放位置&a…...

rust websocket Echo server高性能服务器开发

最近在学习websocket时,一直没有发现好的websocket server工具来调试,于是就自己做了一个websocket server用来学习和调试。因为rust性能遥遥领先,所以就采用了rust来搭建服务器。废话不多说直接上代码main.rs: use tokio::net::TcpListener; use tokio_tungstenite::tung…...

Docker打包SpringBoot项目

一、项目打成jar包 在进行docker打包之前&#xff0c;先确定一下&#xff0c;项目能够正常的打成JAR包&#xff0c;并且启动之后能够正常的访问。这一步看似是可有可无&#xff0c;但是能避免后期的一些无厘头问题。 二、Dockerfile 项目打包成功之后&#xff0c;需要编写Doc…...

ViT学习笔记(二) Patch+Position Embedding阶段的详细推演与理解

我认为讲得最好的一个文章&#xff1a;Vision Transformer详解-CSDN博客 有很多文章&#xff0c;自己并没有完全正确理解。 我的笔记&#xff0c;以ViT的标准应用为例&#xff1a; • 输入图像&#xff1a;输入图像的尺寸是224x224&#xff0c;且是RGB图像&#xff0c;因此输…...

Elasticsearch 单节点安全配置与用户认证

Elasticsearch 单节点安全配置与用户认证 安全扫描时发现了一个高危漏洞&#xff1a;Elasticsearch 未授权访问 。在使用 Elasticsearch 构建搜索引擎或处理大规模数据时&#xff0c;需要启用基本的安全功能来防止未经授权的访问。本文将通过简单的配置步骤&#xff0c;为单节…...

【PHP项目实战】活动报名系统

目录 项目介绍 开发语言 后端 前端 项目截图&#xff08;部分&#xff09; 首页 列表 详情 个人中心 后台管理 项目演示 项目介绍 本项目是一款基于手机浏览器的活动报名系统。它提供了一个方便快捷的活动报名解决方案&#xff0c;无需下载和安装任何APP&#xff0c…...

ASP.NET Core8.0学习笔记(二十五)——EF Core Include导航数据加载之预加载与过滤

一、导航属性数据加载 1.在EF Core中可以使用导航属性来加载相关实体。 2.加载实体的三种方式&#xff1a; (1)预先加载&#xff1a;直接在查询主体时就把对应的依赖实体查出来&#xff08;作为初始查询的一部分&#xff09; (2)显式加载&#xff1a;使用代码指示稍后显式的从…...

【RK3562J开发笔记】MCP2518FD外部CAN-FD控制器的调试方法

“SPI转CAN-FD”是嵌入式开发领域的常用方法&#xff0c;它极大地促进了不同通信接口之间的无缝连接&#xff0c;并显著降低了系统设计的复杂性。飞凌嵌入式依托瑞芯微RK3562J处理器打造的OK3562J-C开发板因为内置了SPI转CAN-FD驱动&#xff0c;从而原生支持这一功能。该开发板…...

docker安装Emqx并使用自签名证书开启 SSL/TLS 连接

docker安装Emqx并使用自签名证书开启 SSL/TLS 连接 一、获取自签名证书1、创建openssl.cnf文件2、生成证书自签名证书 二、docker安装EMQX1、初始化目录2、加载镜像文件并挂载相应的文件目录3、启动docker容器4、EMQX加载自签名证书 三、客户端MQTTX连接测试四、Springboot整合…...

AI驱动的低代码平台:解密背后的算法与架构创新

引言 在如今的数字化浪潮中&#xff0c;企业对软件的需求正以前所未有的速度增长。传统的开发方式由于开发周期长、成本高&#xff0c;已逐渐无法满足市场的快速变化。而低代码平台的出现&#xff0c;使得开发者和业务人员能够以极简的方式快速构建应用。然而&#xff0c;随着企…...

ruoyi的excel批量导入

最简单方式 若依的官方文档提供了教程&#xff0c;可以按照起前后端的教学&#xff0c;进行代码编写 前段 组件 <!-- 导入对话框 --><el-dialogtitle"导入数据"v-model"openImport"width"500px"append-to-body><el-uploadref&quo…...

大数据-244 离线数仓 - 电商核心交易 ODS层 数据库结构 数据加载 DataX

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…...

Spring Security

一.权限控制 1.1 认证和授权概念 问题1&#xff1a;在生产环境下我们如果不登录后台系统就可以完成这 些功能操作吗&#xff1f; 答案显然是否定的&#xff0c;要操作这些功能必须首先登录到系统才可 以。 问题2&#xff1a;是不是所有用户&#xff0c;只要登录成功就都可以操…...

OpenAI 正式发布 o1 完整版

OpenAI 在 o1 模型完整版&#xff0c;该模型相较于之前的 o1-preview 版本在智能能力上有所提升&#xff0c;特别是在编程能力方面&#xff0c;并且能够根据问题的难度智能调节响应速度。此外还新增了图像识别功能&#xff0c;但目前仍然不支持网页浏览、文件上传等功能 o1 模…...

Ubuntu22.04搭建LAMP环境(linux服务器学习笔记)

目录 引言&#xff1a; 一、系统更新 二、安装搭建Apache2 1.你可以通过以下命令安装它&#xff1a; 2.查看Apache2版本 3.查看Apache2运行状态 4.浏览器访问 三、安装搭建MySQL 1.安装MySQL 2.查看MySQL 版本 3.安全配置MySQL 3.1是否设置密码&#xff1f;(按y|Y表…...

C#与PLC通讯时,数据读取和写入浮点数,字节转换问题(ModbusTCP)

在与PLC进行通讯时&#xff0c;会发现一个问题&#xff0c;浮点数1.2接收过来后&#xff0c;居然变成了两个16位的整数。 经过一系列的分析&#xff0c;这是因为在PLC存储浮点数时32位&#xff0c;我们接收过来的数据会变成两个16位的高低字节&#xff0c;而且我们进行下发数据…...

synchronized的特性

1.互斥 对于synchronized修饰的方法及代码块不同线程想同时进行访问就会互斥。 就比如synchronized修饰代码块时&#xff0c;一个线程进入该代码块就会进行“加锁”。 退出代码块时会进行“解锁”。 当其他线程想要访问被加锁的代码块时&#xff0c;就会阻塞等待。 阻塞等待…...

NLP与LLM的工程化实践与学习思考 - 说说知识图谱

NLP与LLM的工程化实践与学习思考[24年半年工作总结] - 说说知识图谱 0 真的就是先说说1 为什么知识图谱什么是知识图谱&#xff1f;基于图的数据结构&#xff1f;基于数据结构的图&#xff1f;知识图谱的技术要点两个技术维度&#xff1a;知识、图七个技术要点&#xff1a;表示…...

php 系统函数 记录

PHP intval() 函数 PHP函数介绍—array_key_exists(): 检查数组中是否存在特定键名 如何使用PHP中的parse_url函数解析URL PHP is_array()函数详解&#xff0c;PHP判断是否为数组 PHP函数介绍&#xff1a;in_array()函数 strpos定义和用法 strpos() 函数查找字符串在另一字符串…...

游戏引擎学习第38天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾上次的内容。 我们之前讨论了将精灵放在屏幕上&#xff0c;但颜色错误的问题。问题最终查明是因为使用了一个调整工具&#xff0c;导致文件的字节顺序发生了变化。重新运行“image magic”工具对一些大图像进行重新处理后&am…...

Android 15 行为变更:所有应用

Android 15 平台包含一些可能会影响您的应用的行为变更。以下行为变更将影响在 Android 15 上运行的所有应用&#xff0c;无论采用哪种 targetSdkVersion 都不例外。您应该测试您的应用&#xff0c;然后根据需要进行修改&#xff0c;以适当地支持这些变更。 此外&#xff0c;请…...

基于pytorch的深度学习基础4——损失函数和优化器

四&#xff0e;损失函数和优化器 4.1 均值初始化 为减轻梯度消失和梯度爆炸&#xff0c;选择合适的权重初值。 十种初始化方法 Initialization Methods 1. Xavie r均匀分布 2. Xavie r正态分布 4. Kaiming正态分布 5. 均匀分布 6. 正态分布 7. 常数分布 8. 正交矩阵初…...

《Clustering Propagation for Universal Medical Image Segmentation》CVPR2024

摘要 这篇论文介绍了S2VNet&#xff0c;这是一个用于医学图像分割的通用框架&#xff0c;它通过切片到体积的传播&#xff08;Slice-to-Volume propagation&#xff09;来统一自动&#xff08;AMIS&#xff09;和交互式&#xff08;IMIS&#xff09;医学图像分割任务。S2VNet利…...

Webpack Source Map 配置详解与优化策略

前言 Source Map 是前端开发和调试中的核心工具之一&#xff0c;它可以显著提高我们在代码调试和错误追踪方面的效率。随着 JavaScript 应用越来越复杂&#xff0c;代码打包和优化成为必然&#xff0c;而这一过程会使得调试变得异常困难。Source Map 的出现&#xff0c;为我们…...

el-tree组件刷新指定id的节点数据

示例 封装一个可以刷新多个指定id的节点数据。 <template><el-tree ref"treeRef"></el-tree> </template><script lang"ts" setup> const treeRef ref()function refreshTreeById(nodeIds: number[]) {nodeIds.forEach((…...

深入 Java 基础 XML:高级特性与最佳实践

在上一篇文章中&#xff0c;我们对 Java 基础 XML 有了一个初步的认识&#xff0c;了解了 XML 的基本结构以及在 Java 中常见的解析方式。今天&#xff0c;我们将进一步深入探讨 Java 与 XML 的结合&#xff0c;包括一些高级特性和最佳实践。 一、XML 命名空间 在复杂的 XML …...

aws(学习笔记第十六课) 使用负载均衡器(ELB)解耦webserver以及输出ELB的日志到S3

aws(学习笔记第十六课) 使用负载均衡器(ELB)以及输出ELB的日志到S3 学习内容&#xff1a; 使用负载均衡器(ELB)解耦web server输出ELB的日志到S3 1. 使用负载均衡器(ELB) 全体架构 使用ELB(Elastic Load Balancer)能够解耦外部internet访问和web server之间的耦合&#xff0c…...

Ubuntu与Centos系统有何区别?

Ubuntu和CentOS都是基于Linux内核的操作系统&#xff0c;但它们在设计理念、使用场景和技术实现上有显著的区别。以下是详细的对比&#xff1a; 1. 基础和发行版本 Ubuntu&#xff1a; 基于Debian&#xff0c;使用.deb包管理系统。包含两个主要版本&#xff1a; LTS&#xff…...

【OpenDRIVE_Python】使用python脚本读取txt指定内容,输出OpenDRIVE数据中对应的信息

示例代码说明&#xff1a; 读取txt指定内容如地物id&#xff0c;输出OpenDRIVE数据中的对应地物id和名称name信息为xml文件 import xml.dom.minidom from xml.dom.minidom import parse from xml.dom import Node import sys import os # 读取OpenDRIVE文件路径 xml_filepath…...

Qt入门8——Qt文件

1. Qt文件概述 文件操作是应用程序必不可少的部分。Qt作为⼀个通用开发库&#xff0c;提供了跨平台的文件操作能力。Qt 提供了很多关于文件的类&#xff0c;通过这些类能够对文件系统进行操作&#xff0c;如文件读写、文件信息获取、文件复制或重命名等。 2. 输入输出设备类 在…...

【每天一道面试题】JWT是什么?Java-jwt是什么?(2024/12/7)

【每天一道面试题】JWT是什么&#xff1f;Java-jwt是什么&#xff1f;&#xff08;2024/12/7) JWT&#xff1a;JSON Web Token 俗称令牌 当我们想实现&#xff1a; 1.用户不用输入用户名和密码就可以登录&#xff08;不用每次都输入用户名和密码&#xff09; 2.用户的信息在传…...