十六,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方式:两种方式:
-
自定义方式
-
引入 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. 总结:
- 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. 最后:
“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”
相关文章:
十六,Spring Boot 整合 Druid 以及使用 Druid 监控功能
十六,Spring Boot 整合 Druid 以及使用 Druid 监控功能 文章目录 十六,Spring Boot 整合 Druid 以及使用 Druid 监控功能1. Druid 的基本介绍2. 准备工作:3. Druid 监控功能 3.1 Druid 监控功能 —— Web 关联监控3.2 Druid 监控功能 —— …...
Python办公—DataMatrix二维条码制作
目录 专栏导读1、库的介绍2、库的安装3、核心代码4、完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动化专…...
Linux:软硬链接
目录 一、概念 软链接 硬链接 二、原理 硬链接 软链接 三、使用场景 硬链接 软链接 一、概念 软链接 在当前目录下,有一个普通文件a.txt。 ln -s a.txt a_soft.link结论: 软链接是一个文件。 观察inode_id,发现软链接有着独立…...
[笔记] Windows 上 Git 安装详细教程:从零开始,附带每个选项解析
Git 是目前最流行的分布式版本控制系统之一,广泛应用于软件开发和项目管理中。对于 Windows 用户来说,正确安装和配置 Git 是开始使用 Git 的第一步。本文提供一份详细的指南,帮助你在 Windows 系统上顺利安装 Git,并解释每个安装…...
23种设计模式之策略模式
目录 1. 简介2. 代码2.1 Strategy (策略接口)2.2 AddStrategy (具体策略类)2.3 SubStrategy (具体策略类)2.4 MultiplyStrategy (具体策略类)2.5 Operation (上下文类&am…...
总篇:Python3+Request+Pytest+Allure+Jenkins接口自动化框架设计思路
1、技术选型 Python3 Python 是一种广泛使用的高级编程语言,具有简洁、易读、易维护的特点。 Python 拥有丰富的第三方库,可以方便地进行接口测试的开发。 Request Request 是一个强大的 HTTP 库,用于发送 HTTP 请求和处理响应。 Request 支持多种 HTTP 方法,如 GET、P…...
【QML】release版本bug,信号的参数无法获取
1. 现象 问题 QML程序在debug编译模式下程序可以正常运行,但是release版本下报错:ReferenceError: para is not defined版本 Qt creator 10.0.2Qt_5_15_2_MinGW 平台 win 10 2. 解决方法 暂时没有找到好的解决办法,只能规避规避方法 //问…...
Javaweb 前端 ajax
作用:和后端交互 script 是 js axios(这里是函数的调用方式){封装的是对象} {}是对象 案例 。then的含义,请求后端之后,后端把数据放在回调 点了清空之后,还要查询全部 await等待请求执行完之后,接收这个结果 代码…...
汽车EEA架构:发展历程
1.发展历程的基本逻辑 汽车电子电气的发展历程中,其使用的基本逻辑是IPO(Input-Processing-Output)模型,如下图1所示: 图 1 那什么是IPO模型了?我们从控制器的原理入手解释IPO模型,控制器的主要用途如下: 根据给定的逻…...
几个Linux系统安装体验: 统信服务器系统
本文介绍统信服务器系统(UOS)的安装。 下载 下载地址: https://www.chinauos.com/resource/download-server 本文下载的文件名称为uos-server-20-1070e-amd64.iso。 安装 本次实践仅是做测试体验,因此在pc上使用虚拟机vmware…...
用二维图像渲染3D场景视频
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...
ChatGPT 最新推出的 Pro 订阅计划,具备哪些能力 ?
OpenAI 最近推出了 ChatGPT Pro,这是一个每月收费 200 美元的高级订阅计划,旨在为用户提供对 OpenAI 最先进模型和功能的高级访问。 以下是 ChatGPT Pro 的主要功能和能力: 高级模型访问: o1 模型:包括 o1 和 o1 Pro…...
如何在 IntelliJ IDEA 中为 Spring Boot 应用实现热部署
文章目录 1. 引言2. 准备工作3. 添加必要的依赖4. 配置 IntelliJ IDEA4.1 启用自动编译4.2 开启热部署策略 5. 测试热部署6. 高级技巧7. 注意事项8. 总结 随着现代开发工具的进步,开发者们越来越重视提高生产力的特性。对于 Java 开发者来说,能够在不重启…...
NLP与LLM的工程化实践与学习思考 - 写在开头
NLP与LLM的工程化实践与学习思考[24年半年工作总结] - 写在开头 0 开头的开头 0 开头的开头 24年因为一些工作原因,短暂在NLP领域遨游了半年。这半年对我的影响蛮大,一来是因为此前从没接触过这个方向学到新东西挺开心的,二来是在工程化实践…...
Redis(一)
Redis 基础 什么是 Redis? Redis (REmote DIctionary Server)是一个基于 C 语言开发的开源 NoSQL 数据库(BSD 许可)。与传统数据库不同的是,Redis 的数据是保存在内存中的(内存数据库…...
RocketMq源码-broker(五)
一、RocketMq存储设计 RocketMQ 主要存储的文件包括Commitlog 文件、ConsumeQueue 文件、IndexFile。RocketMQ 将所有主题的消息存储在同一文件,确保消息发送时顺序写文件,尽最大的能力确保消息发送的高性能与高吞吐量。 但由于一般的消息中间件是基于消…...
【Linux】文件描述符fd
1.前置预备 文件 内容 属性访问文件之前,都必须先打开他 #include<stdio.h> int main() { FILE* fpfopen("log.txt","w"); if(fpNULL) { perror("fopen"); return 1; } fclose(fp); return 0…...
mysql之事务
MySQL的事务隔离特性指的是多个并发事务之间相互隔离的程度,以保证数据的一致性和并发性。MySQL支持四个隔离级别,分别是读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repe…...
python插入mysql数据
# 插入与上一篇变化不大,只是需要进行确认操作. 增加确认操作的方法有两种(假设类对象为a): 1.在连接时传入一个参数:autocommitTrue aConnection( host"localhost", port3306, user"root", password"自己的密码…...
C语言面试题/笔试题/高频面试题
一、C: 1.static和const的作用优缺点 限制作用域: static声明中使用全局变量、函数 ,仅当前文件内可用,其他文件不能引用 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打包之前,先确定一下,项目能够正常的打成JAR包,并且启动之后能够正常的访问。这一步看似是可有可无,但是能避免后期的一些无厘头问题。 二、Dockerfile 项目打包成功之后,需要编写Doc…...
ViT学习笔记(二) Patch+Position Embedding阶段的详细推演与理解
我认为讲得最好的一个文章:Vision Transformer详解-CSDN博客 有很多文章,自己并没有完全正确理解。 我的笔记,以ViT的标准应用为例: • 输入图像:输入图像的尺寸是224x224,且是RGB图像,因此输…...
Elasticsearch 单节点安全配置与用户认证
Elasticsearch 单节点安全配置与用户认证 安全扫描时发现了一个高危漏洞:Elasticsearch 未授权访问 。在使用 Elasticsearch 构建搜索引擎或处理大规模数据时,需要启用基本的安全功能来防止未经授权的访问。本文将通过简单的配置步骤,为单节…...
【PHP项目实战】活动报名系统
目录 项目介绍 开发语言 后端 前端 项目截图(部分) 首页 列表 详情 个人中心 后台管理 项目演示 项目介绍 本项目是一款基于手机浏览器的活动报名系统。它提供了一个方便快捷的活动报名解决方案,无需下载和安装任何APP,…...
ASP.NET Core8.0学习笔记(二十五)——EF Core Include导航数据加载之预加载与过滤
一、导航属性数据加载 1.在EF Core中可以使用导航属性来加载相关实体。 2.加载实体的三种方式: (1)预先加载:直接在查询主体时就把对应的依赖实体查出来(作为初始查询的一部分) (2)显式加载:使用代码指示稍后显式的从…...
【RK3562J开发笔记】MCP2518FD外部CAN-FD控制器的调试方法
“SPI转CAN-FD”是嵌入式开发领域的常用方法,它极大地促进了不同通信接口之间的无缝连接,并显著降低了系统设计的复杂性。飞凌嵌入式依托瑞芯微RK3562J处理器打造的OK3562J-C开发板因为内置了SPI转CAN-FD驱动,从而原生支持这一功能。该开发板…...
docker安装Emqx并使用自签名证书开启 SSL/TLS 连接
docker安装Emqx并使用自签名证书开启 SSL/TLS 连接 一、获取自签名证书1、创建openssl.cnf文件2、生成证书自签名证书 二、docker安装EMQX1、初始化目录2、加载镜像文件并挂载相应的文件目录3、启动docker容器4、EMQX加载自签名证书 三、客户端MQTTX连接测试四、Springboot整合…...
AI驱动的低代码平台:解密背后的算法与架构创新
引言 在如今的数字化浪潮中,企业对软件的需求正以前所未有的速度增长。传统的开发方式由于开发周期长、成本高,已逐渐无法满足市场的快速变化。而低代码平台的出现,使得开发者和业务人员能够以极简的方式快速构建应用。然而,随着企…...
ruoyi的excel批量导入
最简单方式 若依的官方文档提供了教程,可以按照起前后端的教学,进行代码编写 前段 组件 <!-- 导入对话框 --><el-dialogtitle"导入数据"v-model"openImport"width"500px"append-to-body><el-uploadref&quo…...
大数据-244 离线数仓 - 电商核心交易 ODS层 数据库结构 数据加载 DataX
点一下关注吧!!!非常感谢!!持续更新!!! Java篇开始了! 目前开始更新 MyBatis,一起深入浅出! 目前已经更新到了: Hadoop࿰…...
Spring Security
一.权限控制 1.1 认证和授权概念 问题1:在生产环境下我们如果不登录后台系统就可以完成这 些功能操作吗? 答案显然是否定的,要操作这些功能必须首先登录到系统才可 以。 问题2:是不是所有用户,只要登录成功就都可以操…...
OpenAI 正式发布 o1 完整版
OpenAI 在 o1 模型完整版,该模型相较于之前的 o1-preview 版本在智能能力上有所提升,特别是在编程能力方面,并且能够根据问题的难度智能调节响应速度。此外还新增了图像识别功能,但目前仍然不支持网页浏览、文件上传等功能 o1 模…...
Ubuntu22.04搭建LAMP环境(linux服务器学习笔记)
目录 引言: 一、系统更新 二、安装搭建Apache2 1.你可以通过以下命令安装它: 2.查看Apache2版本 3.查看Apache2运行状态 4.浏览器访问 三、安装搭建MySQL 1.安装MySQL 2.查看MySQL 版本 3.安全配置MySQL 3.1是否设置密码?(按y|Y表…...
C#与PLC通讯时,数据读取和写入浮点数,字节转换问题(ModbusTCP)
在与PLC进行通讯时,会发现一个问题,浮点数1.2接收过来后,居然变成了两个16位的整数。 经过一系列的分析,这是因为在PLC存储浮点数时32位,我们接收过来的数据会变成两个16位的高低字节,而且我们进行下发数据…...
synchronized的特性
1.互斥 对于synchronized修饰的方法及代码块不同线程想同时进行访问就会互斥。 就比如synchronized修饰代码块时,一个线程进入该代码块就会进行“加锁”。 退出代码块时会进行“解锁”。 当其他线程想要访问被加锁的代码块时,就会阻塞等待。 阻塞等待…...
NLP与LLM的工程化实践与学习思考 - 说说知识图谱
NLP与LLM的工程化实践与学习思考[24年半年工作总结] - 说说知识图谱 0 真的就是先说说1 为什么知识图谱什么是知识图谱?基于图的数据结构?基于数据结构的图?知识图谱的技术要点两个技术维度:知识、图七个技术要点:表示…...
php 系统函数 记录
PHP intval() 函数 PHP函数介绍—array_key_exists(): 检查数组中是否存在特定键名 如何使用PHP中的parse_url函数解析URL PHP is_array()函数详解,PHP判断是否为数组 PHP函数介绍:in_array()函数 strpos定义和用法 strpos() 函数查找字符串在另一字符串…...
游戏引擎学习第38天
仓库: https://gitee.com/mrxiao_com/2d_game 回顾上次的内容。 我们之前讨论了将精灵放在屏幕上,但颜色错误的问题。问题最终查明是因为使用了一个调整工具,导致文件的字节顺序发生了变化。重新运行“image magic”工具对一些大图像进行重新处理后&am…...
Android 15 行为变更:所有应用
Android 15 平台包含一些可能会影响您的应用的行为变更。以下行为变更将影响在 Android 15 上运行的所有应用,无论采用哪种 targetSdkVersion 都不例外。您应该测试您的应用,然后根据需要进行修改,以适当地支持这些变更。 此外,请…...
基于pytorch的深度学习基础4——损失函数和优化器
四.损失函数和优化器 4.1 均值初始化 为减轻梯度消失和梯度爆炸,选择合适的权重初值。 十种初始化方法 Initialization Methods 1. Xavie r均匀分布 2. Xavie r正态分布 4. Kaiming正态分布 5. 均匀分布 6. 正态分布 7. 常数分布 8. 正交矩阵初…...
《Clustering Propagation for Universal Medical Image Segmentation》CVPR2024
摘要 这篇论文介绍了S2VNet,这是一个用于医学图像分割的通用框架,它通过切片到体积的传播(Slice-to-Volume propagation)来统一自动(AMIS)和交互式(IMIS)医学图像分割任务。S2VNet利…...
Webpack Source Map 配置详解与优化策略
前言 Source Map 是前端开发和调试中的核心工具之一,它可以显著提高我们在代码调试和错误追踪方面的效率。随着 JavaScript 应用越来越复杂,代码打包和优化成为必然,而这一过程会使得调试变得异常困难。Source Map 的出现,为我们…...
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:高级特性与最佳实践
在上一篇文章中,我们对 Java 基础 XML 有了一个初步的认识,了解了 XML 的基本结构以及在 Java 中常见的解析方式。今天,我们将进一步深入探讨 Java 与 XML 的结合,包括一些高级特性和最佳实践。 一、XML 命名空间 在复杂的 XML …...
aws(学习笔记第十六课) 使用负载均衡器(ELB)解耦webserver以及输出ELB的日志到S3
aws(学习笔记第十六课) 使用负载均衡器(ELB)以及输出ELB的日志到S3 学习内容: 使用负载均衡器(ELB)解耦web server输出ELB的日志到S3 1. 使用负载均衡器(ELB) 全体架构 使用ELB(Elastic Load Balancer)能够解耦外部internet访问和web server之间的耦合,…...
Ubuntu与Centos系统有何区别?
Ubuntu和CentOS都是基于Linux内核的操作系统,但它们在设计理念、使用场景和技术实现上有显著的区别。以下是详细的对比: 1. 基础和发行版本 Ubuntu: 基于Debian,使用.deb包管理系统。包含两个主要版本: LTSÿ…...
【OpenDRIVE_Python】使用python脚本读取txt指定内容,输出OpenDRIVE数据中对应的信息
示例代码说明: 读取txt指定内容如地物id,输出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作为⼀个通用开发库,提供了跨平台的文件操作能力。Qt 提供了很多关于文件的类,通过这些类能够对文件系统进行操作,如文件读写、文件信息获取、文件复制或重命名等。 2. 输入输出设备类 在…...
【每天一道面试题】JWT是什么?Java-jwt是什么?(2024/12/7)
【每天一道面试题】JWT是什么?Java-jwt是什么?(2024/12/7) JWT:JSON Web Token 俗称令牌 当我们想实现: 1.用户不用输入用户名和密码就可以登录(不用每次都输入用户名和密码) 2.用户的信息在传…...