01.【面试题】在SpringBoot中如何实现多数据源配置

文章目录

    • 1. 什么是多数据源
      • 1.1 基本概念
      • 1.2 传统单数据源 vs 多数据源
        • 单数据源架构
        • 多数据源架构
    • 2. 为什么需要多数据源
      • 2.1 业务场景需求
      • 2.2 技术优势
    • 3. 多数据源的实现方式
      • 3.1 静态多数据源
      • 3.2 动态多数据源
    • 4. 环境准备
      • 4.1 创建SpringBoot项目
        • pom.xml依赖配置
      • 4.2 准备测试数据库
        • 创建两个测试数据库
    • 5. 方法一:使用@Primary和@Qualifier注解
      • 5.1 配置文件
        • application.yml
      • 5.2 数据源配置类
        • DataSourceConfig.java
      • 5.3 MyBatis配置类
        • PrimaryMyBatisConfig.java
        • SecondaryMyBatisConfig.java
      • 5.4 实体类
        • User.java
        • Order.java
      • 5.5 Mapper接口
        • UserMapper.java
        • OrderMapper.java
      • 5.6 MyBatis XML映射文件
        • UserMapper.xml
        • OrderMapper.xml
      • 5.7 Service层
        • UserService.java
        • OrderService.java
      • 5.8 Controller层
        • UserController.java
        • OrderController.java
    • 6. 方法二:使用@ConfigurationProperties
      • 6.1 更简洁的配置方式
        • DataSourceProperties.java
        • application.yml(配置属性方式)
        • EnhancedDataSourceConfig.java
    • 7. 方法三:动态数据源切换
      • 7.1 动态数据源核心类
        • DynamicDataSource.java
        • DataSourceContextHolder.java
        • DataSource.java(注解)
      • 7.2 AOP切面处理数据源切换
        • DataSourceAspect.java
      • 7.3 动态数据源配置
        • DynamicDataSourceConfig.java
      • 7.4 使用动态数据源的Service
        • DynamicUserService.java
        • DynamicOrderService.java
      • 7.5 动态数据源控制器
        • DynamicController.java
    • 8. 方法四:使用MyBatis-Plus多数据源
      • 8.1 添加MyBatis-Plus依赖
        • pom.xml(添加MyBatis-Plus)
      • 8.2 MyBatis-Plus配置
        • application.yml(MyBatis-Plus多数据源配置)
      • 8.3 MyBatis-Plus实体类
        • User.java(MyBatis-Plus版本)
        • Order.java(MyBatis-Plus版本)
      • 8.4 MyBatis-Plus Mapper接口
        • UserPlusMapper.java
        • OrderPlusMapper.java
      • 8.5 MyBatis-Plus Service层
        • UserPlusService.java
        • OrderPlusService.java
      • 8.6 MyBatis-Plus控制器
        • UserPlusController.java
    • 9. 事务管理
      • 9.1 单数据源事务
        • 基本事务使用
      • 9.2 多数据源事务
        • ChainedTransactionManager(链式事务管理器)
        • 多数据源事务服务
      • 9.3 分布式事务
        • JTA配置(Atomikos)
        • application.yml(JTA配置)
        • JTA数据源配置
    • 10. 常见问题和解决方案
      • 10.1 循环依赖问题
        • 问题描述
        • 解决方案
      • 10.2 事务不生效问题
        • 问题1:类内部调用
        • 解决方案
        • 问题2:异常类型不匹配
        • 解决方案
      • 10.3 数据源配置错误
        • 问题:配置文件格式错误
        • 解决方案
      • 10.4 MyBatis映射问题
        • 问题:SQL映射找不到
        • 解决方案
      • 10.5 连接池配置问题
        • 监控和调优连接池
    • 11. 最佳实践
      • 11.1 配置规范
        • 1. 数据源命名规范
        • 2. 配置文件组织
      • 11.2 包结构规范
      • 11.3 性能优化
        • 1. 连接池优化
        • 2. 读写分离优化
      • 11.4 监控和维护
        • 1. 数据源监控
        • 2. 健康检查
      • 11.5 安全最佳实践
        • 1. 密码加密
        • 2. 连接参数安全
    • 12. 总结
      • 12.1 多数据源实现方式对比
      • 12.2 选择建议
        • 1. 简单业务场景
        • 2. 复杂业务场景
        • 3. 快速开发
        • 4. 企业级应用
      • 12.3 重要注意事项
      • 12.4 学习路径建议

1. 什么是多数据源

1.1 基本概念

多数据源(Multiple DataSources)是指在一个SpringBoot应用中同时连接和使用多个数据库的技术。这些数据库可以是:

  • 不同类型的数据库:MySQL、PostgreSQL、Oracle等
  • 相同类型的不同实例:主库、从库、不同业务的数据库
  • 不同环境的数据库:开发、测试、生产环境

1.2 传统单数据源 vs 多数据源

单数据源架构
SpringBoot应用 → 单个DataSource → 单个数据库
多数据源架构
SpringBoot应用 → DataSource1 → 数据库1(用户数据)→ DataSource2 → 数据库2(订单数据)→ DataSource3 → 数据库3(日志数据)

2. 为什么需要多数据源

2.1 业务场景需求

  1. 读写分离:主库写入,从库读取,提高性能
  2. 业务隔离:不同业务模块使用独立数据库
  3. 数据迁移:新老系统数据库并存
  4. 分布式架构:微服务架构中的数据分离

2.2 技术优势

  • 性能优化:分散数据库压力
  • 数据安全:重要数据隔离存储
  • 扩展性好:易于水平扩展
  • 故障隔离:一个数据库故障不影响其他业务

3. 多数据源的实现方式

3.1 静态多数据源

  • 编译时确定:在代码中明确指定使用哪个数据源
  • 配置简单:通过注解或配置类实现
  • 性能较好:没有动态切换的开销

3.2 动态多数据源

  • 运行时决定:根据业务逻辑动态选择数据源
  • 灵活性高:可以根据条件动态切换
  • 实现复杂:需要自定义路由逻辑

4. 环境准备

4.1 创建SpringBoot项目

pom.xml依赖配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.8</version><relativePath/></parent><groupId>com.example</groupId><artifactId>multi-datasource-demo</artifactId><version>1.0.0</version><name>multi-datasource-demo</name><description>SpringBoot多数据源配置示例</description><properties><java.version>1.8</java.version></properties><dependencies><!-- SpringBoot Web Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- SpringBoot JDBC Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- MyBatis Starter --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.0</version></dependency><!-- MySQL驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- 连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.16</version></dependency><!-- Lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- Test --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

4.2 准备测试数据库

创建两个测试数据库
-- 创建用户数据库
CREATE DATABASE user_db CHARACTER SET utf8mb4;-- 创建订单数据库
CREATE DATABASE order_db CHARACTER SET utf8mb4;-- 用户表
USE user_db;
CREATE TABLE user (id BIGINT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL,email VARCHAR(100),age INT,create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);INSERT INTO user (username, email, age) VALUES 
('张三', 'zhangsan@example.com', 25),
('李四', 'lisi@example.com', 30),
('王五', 'wangwu@example.com', 28);-- 订单表
USE order_db;
CREATE TABLE orders (id BIGINT PRIMARY KEY AUTO_INCREMENT,user_id BIGINT NOT NULL,product_name VARCHAR(100) NOT NULL,price DECIMAL(10,2),quantity INT,create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);INSERT INTO orders (user_id, product_name, price, quantity) VALUES 
(1, 'iPhone 14', 8999.00, 1),
(2, 'MacBook Pro', 15999.00, 1),
(1, 'AirPods', 1999.00, 2);

5. 方法一:使用@Primary和@Qualifier注解

5.1 配置文件

application.yml
# SpringBoot多数据源配置
spring:# 主数据源配置(用户数据库)datasource:primary:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/user_db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456type: com.alibaba.druid.pool.DruidDataSource# Druid连接池配置druid:initial-size: 5min-idle: 5max-active: 20max-wait: 60000time-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000validation-query: SELECT 1test-while-idle: truetest-on-borrow: falsetest-on-return: false# 从数据源配置(订单数据库)secondary:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/order_db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456type: com.alibaba.druid.pool.DruidDataSourcedruid:initial-size: 5min-idle: 5max-active: 20max-wait: 60000time-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000validation-query: SELECT 1test-while-idle: truetest-on-borrow: falsetest-on-return: false# MyBatis配置
mybatis:mapper-locations: classpath:mapper/**/*.xmltype-aliases-package: com.example.entityconfiguration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImpl# 日志配置
logging:level:com.example.mapper: debugorg.springframework.jdbc: debug

5.2 数据源配置类

DataSourceConfig.java
package com.example.config;import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;import javax.sql.DataSource;/*** 多数据源配置类* 使用@Primary和@Qualifier注解方式实现多数据源*/
@Configuration
public class DataSourceConfig {/*** 创建主数据源(用户数据库)* @Primary 注解表示这是主要的数据源,当有多个同类型Bean时优先使用此Bean* @ConfigurationProperties 自动绑定配置文件中的属性*/@Primary@Bean(name = "primaryDataSource")@ConfigurationProperties(prefix = "spring.datasource.primary")public DataSource primaryDataSource() {return new DruidDataSource();}/*** 创建从数据源(订单数据库)*/@Bean(name = "secondaryDataSource")@ConfigurationProperties(prefix = "spring.datasource.secondary")public DataSource secondaryDataSource() {return new DruidDataSource();}/*** 主数据源的JdbcTemplate*/@Primary@Bean(name = "primaryJdbcTemplate")public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource dataSource) {return new JdbcTemplate(dataSource);}/*** 从数据源的JdbcTemplate*/@Bean(name = "secondaryJdbcTemplate")public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource) {return new JdbcTemplate(dataSource);}/*** 主数据源的事务管理器*/@Primary@Bean(name = "primaryTransactionManager")public DataSourceTransactionManager primaryTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}/*** 从数据源的事务管理器*/@Bean(name = "secondaryTransactionManager")public DataSourceTransactionManager secondaryTransactionManager(@Qualifier("secondaryDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}

5.3 MyBatis配置类

PrimaryMyBatisConfig.java
package com.example.config;import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import javax.sql.DataSource;/*** 主数据源MyBatis配置* 扫描用户相关的Mapper接口*/
@Configuration
@MapperScan(basePackages = "com.example.mapper.user", sqlSessionTemplateRef = "primarySqlSessionTemplate")
public class PrimaryMyBatisConfig {/*** 主数据源的SqlSessionFactory*/@Primary@Bean(name = "primarySqlSessionFactory")public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);// 设置MyBatis配置文件位置bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/user/*.xml"));// 设置实体类别名包路径bean.setTypeAliasesPackage("com.example.entity");return bean.getObject();}/*** 主数据源的SqlSessionTemplate*/@Primary@Bean(name = "primarySqlSessionTemplate")public SqlSessionTemplate primarySqlSessionTemplate(@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {return new SqlSessionTemplate(sqlSessionFactory);}
}
SecondaryMyBatisConfig.java
package com.example.config;import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import javax.sql.DataSource;/*** 从数据源MyBatis配置* 扫描订单相关的Mapper接口*/
@Configuration
@MapperScan(basePackages = "com.example.mapper.order", sqlSessionTemplateRef = "secondarySqlSessionTemplate")
public class SecondaryMyBatisConfig {/*** 从数据源的SqlSessionFactory*/@Bean(name = "secondarySqlSessionFactory")public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);// 设置MyBatis配置文件位置bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/order/*.xml"));// 设置实体类别名包路径bean.setTypeAliasesPackage("com.example.entity");return bean.getObject();}/*** 从数据源的SqlSessionTemplate*/@Bean(name = "secondarySqlSessionTemplate")public SqlSessionTemplate secondarySqlSessionTemplate(@Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {return new SqlSessionTemplate(sqlSessionFactory);}
}

5.4 实体类

User.java
package com.example.entity;import lombok.Data;
import java.time.LocalDateTime;/*** 用户实体类*/
@Data
public class User {private Long id;private String username;private String email;private Integer age;private LocalDateTime createTime;
}
Order.java
package com.example.entity;import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;/*** 订单实体类*/
@Data
public class Order {private Long id;private Long userId;private String productName;private BigDecimal price;private Integer quantity;private LocalDateTime createTime;
}

5.5 Mapper接口

UserMapper.java
package com.example.mapper.user;import com.example.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;import java.util.List;/*** 用户Mapper接口* 此接口会使用主数据源(用户数据库)*/
@Mapper
public interface UserMapper {/*** 查询所有用户*/List<User> findAll();/*** 根据ID查询用户*/User findById(@Param("id") Long id);/*** 根据用户名查询用户*/User findByUsername(@Param("username") String username);/*** 插入用户*/int insert(User user);/*** 更新用户*/int update(User user);/*** 删除用户*/int deleteById(@Param("id") Long id);
}
OrderMapper.java
package com.example.mapper.order;import com.example.entity.Order;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;import java.util.List;/*** 订单Mapper接口* 此接口会使用从数据源(订单数据库)*/
@Mapper

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

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

相关文章

redis主从模型与对象模型

redis淘汰策略 首先我们要明确这里说的淘汰策略是淘汰散列表中的key-value&#xff0c;而不是value中的各个数据结构 过期key中 volatile-lru 从设置了过期时间的键中&#xff0c;移除最近最少使用的键&#xff08;LRU算法&#xff09;。适合需要优先保留高频访问数据的场景…

快速搭建开源网页编辑器(vue+TinyMCE)

文章目录 Tiny MCE 安装方法 1. 安装node.js 2. 创建vue3项目 3. 安装TinyMCE依赖并使用 (1)在component文件夹创建Editor.vue文件 (2)编辑App.vue文件 (3)运行项目 (4)获取并设置API key (5)设置中文菜单 Tiny MCE 安装方法 1. 安装node.js 下载地址:https://nod…

ADK【4】内置前端调用流程

文章目录说明ADK内置前端ADK内置前端开启流程说明 本文学自赋范社区公开课&#xff0c;仅供学习和交流使用&#xff0c;不用作任何商业用途&#xff01; ADK内置前端 ADK作为最新一代Agent开发框架&#xff0c;不仅功能特性非常领先&#xff0c;而且还内置了非常多的工具&am…

LLMs之GPT-5:OpenAI 发布更智能、更快速、更有用的 AI 模型—内置思考能力,赋能人人专家级智能—技术突破、性能评估与安全保障全面解读

LLMs之GPT-5&#xff1a;OpenAI 发布更智能、更快速、更有用的 AI 模型—内置思考能力&#xff0c;赋能人人专家级智能—技术突破、性能评估与安全保障全面解读 导读&#xff1a;2025年8月7日&#xff0c;OpenAI 发布了 GPT-5&#xff0c;这是他们目前最智能的 AI 系统。它在编…

Java 中操作 R 的全面指南

Java 中操作 R 的全面指南 引言 Java作为一种广泛使用的编程语言,具有跨平台、高性能、可扩展等特点。随着大数据和机器学习的兴起,Java在处理和分析复杂数据集方面发挥着越来越重要的作用。R语言,作为一种专门用于统计计算和图形展示的语言,同样在数据分析领域有着举足轻…

数据结构——优先级队列(PriorityQueue):一文解决 Top K 问题!

目录 1.优先级队列 2. 堆的概念 3. 堆的存储方式 4. 堆的创建 4.1 向下调整 4.2 堆的创建 4.3 堆的插入 4.4 堆的删除 5.用堆模拟实现优先级队列 6.常用接口的介绍 6.1 PriorityQueue 的特性 6.2 PriorityQueue 的方法 7. Top K问题 1.优先级队列 队列是一种先进先…

C语言自定义类型深度解析:联合体与枚举

在C语言中&#xff0c;自定义类型为数据组织提供了极大的灵活性。除了常用的结构体&#xff0c;联合体&#xff08;共用体&#xff09;和枚举也是非常重要的自定义类型。本文将结合实例&#xff0c;详细解析联合体和枚举的特性、用法及实际应用场景。 一、联合体&#xff08;Un…

Numpy科学计算与数据分析:Numpy数据分析基础之统计函数应用

Numpy统计函数实战&#xff1a;数据的聚合与分析 学习目标 通过本课程的学习&#xff0c;学员将掌握Numpy中用于统计分析的关键函数&#xff0c;如求和(sum)、平均值(mean)、标准差(std)等&#xff0c;能够熟练地在实际数据集中应用这些函数进行数据的聚合与分析。 相关知识…

从引导加载程序到sysfs:Linux设备树的完整解析与驱动绑定机制

摘要本报告旨在为嵌入式Linux开发者详细梳理设备树&#xff08;Device Tree, DT&#xff09;在系统启动中的完整解析流程。报告将从引导加载程序&#xff08;Bootloader&#xff09;如何准备和传递设备树二进制文件&#xff08;DTB&#xff09;开始&#xff0c;逐步深入到内核如…

基于深度学习的污水新冠RNA测序数据分析系统

基于深度学习的污水新冠RNA测序数据分析系统 摘要 本文介绍了一个完整的基于深度学习技术的污水新冠RNA测序数据分析系统&#xff0c;该系统能够从未经处理的污水样本中识别新冠病毒变种、监测病毒动态变化并构建传播网络。我们详细阐述了数据处理流程、深度学习模型架构、训练…

宝塔面板配置Nacos集群

一、环境准备 准备三台及以上的服务器&#xff0c;我这里准备了3台服务器&#xff0c;172.31.5.123&#xff5e;125&#xff1b;分别安装好宝塔面板&#xff0c;软件商店里安装nacos&#xff1b;二、Nacos集群配置 配置数据库连接&#xff1a;​ 进入每台服务器上 Nacos 解压后…

Spring Boot 3.x 全新特性解析

Spring Boot 是企业级 Java 开发中最常用的框架之一。自 Spring Boot 3.x 发布以来&#xff0c;其引入的一系列重大变更与优化&#xff0c;为开发者提供了更现代、更高效的开发体验。本文将重点解析 Spring Boot 3.x 的关键特性及其对项目架构的影响。 一、基于 Jakarta EE 10 …

2025.8.10总结

今天晚上去跑了2公里&#xff0c;跑完还挺爽的&#xff0c;然后花了1.5个小时去公司刷题&#xff0c;没有进行限时练&#xff0c;花了一周的时间才做完这题&#xff0c;共找了20个bug&#xff0c;虽然没有进行限时练&#xff0c;但我仿佛对测试技术掌握得更好了&#xff0c;知道…

qt中实现QListWidget列表

使用最基本的QListWidgetItem来创建列表项&#xff0c;具体使用下面setText、setIcon、addItem这三个方法#include "mainwindow.h" #include "ui_mainwindow.h" #include "QDebug"enum CustomRoles {IdRole Qt::UserRole, // 存储IDPhoneR…

nginx-主配置文件

nginx-主配置文件一、主配置文件nginx.conf内容二、修改配置的文件后的操作三、配置虚拟主机的域名1. 修改nignx.conf配置文件2. 新建域名对应的网页根目录3. 重载nginx配置4. 验证一、主配置文件nginx.conf内容 [rootweb1 conf]# cat nginx.conf#user nobody; # nginx woke…

DBSACN算法的一些应用

以下是 DBSCAN 算法在 Python 中的几个典型应用示例&#xff0c;涵盖了基础使用、参数调优和可视化等方面&#xff1a;import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import DBSCAN from sklearn.datasets import make_moons, make_blobs from skl…

java9学习笔记-part1

G1 成为默认垃圾回收器在 Java 8 的时候&#xff0c;默认垃圾回收器是 Parallel Scavenge&#xff08;新生代&#xff09;Parallel Old&#xff08;老年代&#xff09;。到了 Java 9, CMS 垃圾回收器被废弃了&#xff0c;G1&#xff08;Garbage-First Garbage Collector&#x…

【github.io静态网页 怎么使用 github.io 搭建一个简单的网页?】

这里是一张展示 GitHub Pages 静态网站架构与部署流程的示意图&#xff0c;可以帮助你更直观理解整个流程。 要使用 github.io&#xff08;GitHub Pages&#xff09;搭建一个简单的网页&#xff0c;你可以按照以下步骤操作&#xff1a; 快速入门&#xff1a;个人网站&#xff…

记录一次ubuntu20.04 解决gmock not found问题的过程

在电脑上源码编译moveit&#xff0c;系统是ubuntu20.04&#xff0c;有三个电脑&#xff0c;分别叫做A,B,C好了&#xff0c;A和C都可以很顺畅地走流程编译通过&#xff0c;但是B遇到了gmock not found的问题&#xff0c;一开始没当回事&#xff0c;感觉重装下库&#xff0c;或者…

Java基础编程核心案例:从逻辑到应用

Java编程的核心在于将逻辑思维转化为可执行的代码。本专栏通过8个实用案例&#xff0c;覆盖条件判断、循环结构、数组操作、用户交互等基础知识点&#xff0c;展示如何用Java解决实际问题&#xff0c;从简单游戏到数据计算&#xff0c;逐步构建编程思维。 案例一&#xff1a;剪…