【springboot】 多数据源实现
文章目录
- 1. 引言:多数据源的必要性和应用场景
- **为什么需要多数据源?**
- **应用场景**
- 2. Spring Boot中的数据源配置
- 2.1 默认数据源配置简介
- 2.2 如何在Spring Boot中配置多个数据源
- 3. 整合MyBatis与多数据源
- **配置MyBatis使用多数据源**
- **Mapper接口的数据源指定**
- 4. 数据源的动态路由
- 4.1 什么是数据源路由?
- 4.2 实现一个简单的动态数据源路由
- 5. 事务管理配置
- **如何管理多数据源下的事务**
- **配置全局事务和局部事务**
- 6. 实战示例:完整的多数据源配置示例
- 示例概述
- **步骤 1: 添加依赖**
- **步骤 2: 配置数据源**
- **步骤 3: 配置数据源 Bean 和 MyBatis**
- **步骤 4: 动态数据源路由**
- **步骤 5: 配置和使用**
- 7. 简化多数据源管理-**dynamic**
- 功能和特点
- 应用场景
- 引入依赖
- 配置多数据源
- 使用 @DS 注解
- 在方法上使用
- 在类上使用
- 注意事项
1. 引言:多数据源的必要性和应用场景
在现代软件开发中,随着业务的复杂性增加和数据量的急剧膨胀,一个应用可能需要同时访问多种数据库来满足不同的数据处理需求。例如,一个电子商务系统可能需要一个数据库来处理交易数据,另一个数据库来分析用户行为。这就是多数据源配置的必要性所在。
为什么需要多数据源?
- 业务逻辑分离:不同的数据库可以承载不同的业务模块,例如,订单处理和用户分析可以分别在不同的数据库中进行,使得业务更加清晰,同时提高系统的可维护性。
- 性能优化:通过分散请求到专门的数据库,可以避免单一数据库因请求过多而成为性能瓶颈,从而提高整个应用的性能。
- 数据安全和隔离:敏感数据可以单独存储在更加安全的数据库中,普通数据则可以在常规安全级别的数据库中处理,从而提高数据安全性。
- 技术多样性:不同的数据库技术(如关系型数据库和非关系型数据库)有其特定优势,多数据源配置允许在一个项目中利用各种数据库技术的优势。
应用场景
- 大数据分析与实时业务系统并行:在很多企业级应用中,通常需要将实时业务数据库和大数据分析数据库分开管理,以免复杂的数据分析操作影响到核心业务系统的性能。
- 微服务架构:在微服务架构中,各个微服务可能需要独立的数据库实例,以保持服务的自治性和解耦。
- 遗留系统整合:在新旧系统整合过程中,可能需要同时接入新旧系统的数据库,以保证数据的完整性和一致性。
- 跨地域数据处理:全球化业务可能需要在不同地域部署数据库,以减少数据访问延迟和符合地域数据法规。
通过这些场景,我们可以看出,多数据源的配置不仅是一种技术需求,更是业务发展和数据管理策略的一部分。
2. Spring Boot中的数据源配置
Spring Boot极大地简化了Java应用的数据库连接和操作。它通过自动配置支持快速启动和运行,但在处理多数据源时,需要进行一些额外的配置。以下是如何在Spring Boot中配置单个默认数据源以及如何扩展到多数据源的详细说明。
2.1 默认数据源配置简介
在Spring Boot中,配置一个默认的数据源非常简单。你只需要在application.properties
或application.yml
文件中添加相关的数据库连接配置即可。Spring Boot使用这些属性自动配置数据源和JPA或JDBC模板。
示例 - application.properties
配置:
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
spring.datasource.username=myuser
spring.datasource.password=mypass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
这些配置告诉Spring Boot如何连接到数据库,并使用哪个JDBC驱动。Spring Boot支持大多数主流数据库,并自动配置连接池(默认是HikariCP
)。
2.2 如何在Spring Boot中配置多个数据源
配置多个数据源需要更多的手动设置。你需要定义每个数据源的配置,并确保Spring Boot能够正确地区分和管理它们。以下是配置多数据源的步骤:
步骤 1: 定义数据源配置
首先,你需要在配置文件中为每个数据源定义不同的前缀。例如:
# 主数据源
spring.datasource.primary.url=jdbc:mysql://localhost:3306/primary_db
spring.datasource.primary.username=root
spring.datasource.primary.password=123456
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver# 辅助数据源
spring.datasource.secondary.url=jdbc:mysql://localhost:3306/secondary_db
spring.datasource.secondary.username=root
spring.datasource.secondary.password=123456
spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver
步骤 2: 创建数据源配置类
你需要创建配置类来加载和区分这些数据源。每个数据源都应该有自己的配置类和@Bean定义。
@Configuration
public class DataSourceConfig {@Bean(name = "primaryDataSource")@Primary@ConfigurationProperties(prefix = "spring.datasource.primary")public DataSource primaryDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "secondaryDataSource")@ConfigurationProperties(prefix = "spring.datasource.secondary")public DataSource secondaryDataSource() {return DataSourceBuilder.create().build();}
}
在这个配置中,@Primary
注解标记了主数据源,这意味着如果有多个数据源可用,Spring Boot会默认使用标记为@Primary
的数据源。
步骤 3: 配置JdbcTemplate或EntityManager
对于每个数据源,你可能需要配置一个JdbcTemplate
或EntityManager
以便于操作数据库。
@Bean
public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource dataSource) {return new JdbcTemplate(dataSource);
}@Bean
public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource) {return new JdbcTemplate(dataSource);
}
通过以上步骤,你可以在Spring Boot应用中配置并使用多个数据源。这种配置方式不仅可以满足复杂的业务需求,还可以帮助你更好地管理和维护不同的数据环境。
3. 整合MyBatis与多数据源
MyBatis 是一个流行的持久层框架,它支持定制化 SQL、存储过程以及高级映射。在 Spring Boot 应用中整合 MyBatis 用于多数据源管理,需要一些特定的配置来确保每个数据源正确地与对应的 SQL 映射和事务管理器绑定。
配置MyBatis使用多数据源
要配置 MyBatis 使用多个数据源,你需要定义每个数据源的 SqlSessionFactory
和 TransactionManager
。这确保了 MyBatis 能够为每个数据库连接提供独立的会话和事务控制。
- 定义数据源:如之前所述,定义多个数据源。
- 创建 SqlSessionFactory:为每个数据源创建一个
SqlSessionFactory
,这是 MyBatis 的核心组件,用于管理 MyBatis 的所有 SQL 操作。 - 配置 TransactionManager:为每个数据源配置一个事务管理器,确保事务的正确管理。
@Configuration
public class MyBatisConfig {@Bean@Primarypublic SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();sessionFactory.setDataSource(dataSource);return sessionFactory.getObject();}@Beanpublic SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();sessionFactory.setDataSource(dataSource);return sessionFactory.getObject();}@Bean@Primarypublic DataSourceTransactionManager primaryTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Beanpublic DataSourceTransactionManager secondaryTransactionManager(@Qualifier("secondaryDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}
Mapper接口的数据源指定
在定义了不同的 SqlSessionFactory
后,需要指定每个 Mapper 接口或 XML 映射文件应该使用哪个数据源。这通常通过在 Mapper 接口上使用特定的注解或通过配置来实现。
- 使用
@MapperScan
注解指定数据源:可以在配置类中使用@MapperScan
注解为不同的包指定不同的SqlSessionFactory
。
@Configuration
@MapperScan(basePackages = "com.example.primary.mapper", sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryDataSourceConfig {// Primary data source configuration
}@Configuration
@MapperScan(basePackages = "com.example.secondary.mapper", sqlSessionFactoryRef = "secondarySqlSessionFactory")
public class SecondaryDataSourceConfig {// Secondary data source configuration
}
通过这种方式,你可以确保每个数据源的 Mapper 接口只会与指定的 SqlSessionFactory
交互,从而实现真正意义上的数据源隔离。这样的配置使得管理大型项目中的多数据源更加灵活和高效。
4. 数据源的动态路由
在多数据源的环境中,动态数据源路由成为一种强大的策略,允许应用程序在运行时根据特定的逻辑或条件选择不同的数据库。这对于需要根据用户请求、事务特性或其他业务逻辑动态切换数据源的应用尤其有用。
4.1 什么是数据源路由?
数据源路由是一种机制,它根据一定的规则动态地决定数据库操作应该走哪个数据源。例如,在一个多租户系统中,每个租户可能有自己的数据库,系统需要根据当前用户的租户信息动态切换到相应的数据库。
4.2 实现一个简单的动态数据源路由
为了实现动态数据源路由,我们通常需要创建一个动态数据源路由器,这个路由器继承自AbstractRoutingDataSource
,并重写determineCurrentLookupKey()
方法来决定使用哪个数据源键。
以下是一个简单的实现示例:
1. 定义动态数据源类
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {// DynamicDataSourceContextHolder用于持有当前线程使用的数据源标识return DynamicDataSourceContextHolder.getDataSourceType();}
}
2. 配置动态数据源
在Spring配置文件中,你需要配置DynamicDataSource
作为数据源,并指定实际的数据源映射。
@Configuration
public class DataSourceConfig {@Beanpublic DataSource dataSource() {DynamicDataSource dynamicDataSource = new DynamicDataSource();// 设置默认数据源dynamicDataSource.setDefaultTargetDataSource(primaryDataSource());// 配置多数据源Map<Object, Object> dataSourceMap = new HashMap<>();dataSourceMap.put("primary", primaryDataSource());dataSourceMap.put("secondary", secondaryDataSource());dynamicDataSource.setTargetDataSources(dataSourceMap);return dynamicDataSource;}@Beanpublic DataSource primaryDataSource() {return new HikariDataSource(); // 配置主数据源}@Beanpublic DataSource secondaryDataSource() {return new HikariDataSource(); // 配置次级数据源}
}
3. 使用@Transactional
指定数据源
在服务或数据访问层,你可以通过指定@Transactional
注解的value
属性来选择特定的数据源。
@Service
public class UserService {@Transactional(value = "primaryTransactionManager")public void addUser(User user) {// 使用主数据源添加用户}@Transactional(value = "secondaryTransactionManager")public User findUser(String username) {// 使用次级数据源查找用户}
}
这样的设置允许应用在运行时根据业务需求灵活选择合适的数据源,从而实现更复杂的数据操作策略和更高的数据操作灵活性。
5. 事务管理配置
在处理多数据源时,事务管理变得尤为重要,因为不当的事务处理可能导致数据不一致和其他严重问题。在Spring Boot应用中,正确配置和管理多数据源下的事务是确保数据完整性和一致性的关键。
如何管理多数据源下的事务
-
局部事务:
- 局部事务是最简单的事务类型,它仅涉及单一数据源。在Spring Boot中,你可以为每个数据源配置一个事务管理器。然后,你可以在服务层使用
@Transactional
注解来指定使用哪个事务管理器。 - 示例配置事务管理器:
@Bean public DataSourceTransactionManager transactionManager1(DataSource dataSource1) {return new DataSourceTransactionManager(dataSource1); }@Bean public DataSourceTransactionManager transactionManager2(DataSource dataSource2) {return new DataSourceTransactionManager(dataSource2); }
- 使用指定的事务管理器:
@Transactional(transactionManager = "transactionManager1") public void someDataServiceMethod() {// 业务逻辑 }
- 局部事务是最简单的事务类型,它仅涉及单一数据源。在Spring Boot中,你可以为每个数据源配置一个事务管理器。然后,你可以在服务层使用
-
全局事务:
- 全局事务(也称为分布式事务)涉及多个数据源或服务。在Spring Boot中,可以使用JTA(Java Transaction API)来配置全局事务管理器,如Atomikos或Bitronix。
- 配置全局事务管理器(使用Atomikos为例):
@Bean(initMethod = "init", destroyMethod = "close") public UserTransactionManager atomikosTransactionManager() throws Throwable {UserTransactionManager userTransactionManager = new UserTransactionManager();userTransactionManager.setForceShutdown(false);return userTransactionManager; }@Bean public JtaTransactionManager transactionManager(UserTransactionManager userTransactionManager) {JtaTransactionManager transactionManager = new JtaTransactionManager();transactionManager.setTransactionManager(userTransactionManager);transactionManager.setUserTransaction(userTransactionManager);return transactionManager; }
- 在服务层使用全局事务管理器:
@Transactional public void someDataServiceMethod() {// 业务逻辑涉及多个数据源 }
配置全局事务和局部事务
在配置事务管理时,你需要决定每个业务场景适合使用局部事务还是全局事务。局部事务简单且性能较好,适用于单一数据源操作。全局事务适用于需要跨多个数据库或服务的操作,但可能会带来更高的性能开销。
确保在配置和使用事务时,明确区分不同的事务管理器,特别是在使用@Transactional
注解时指定正确的管理器,以避免事务管理混乱导致的数据问题。
6. 实战示例:完整的多数据源配置示例
在这个部分,我们将通过一个实际的示例来展示如何在Spring Boot应用中配置和使用多个数据源。这个示例将包括配置文件、数据源配置、MyBatis集成、以及动态数据源的实现。
示例概述
假设我们有一个应用需要同时访问两个数据库:一个是主数据库(用于日常业务操作),另一个是审计数据库(用于记录审计日志)。我们将使用MySQL作为数据库。
步骤 1: 添加依赖
首先,在pom.xml
中添加必要的依赖:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency>
</dependencies>
步骤 2: 配置数据源
在application.yml
中配置两个数据源:
spring:datasource:primary:jdbc-url: jdbc:mysql://localhost:3306/business_dbusername: user1password: pass1driver-class-name: com.mysql.cj.jdbc.Driveraudit:jdbc-url: jdbc:mysql://localhost:3306/audit_dbusername: user2password: pass2driver-class-name: com.mysql.cj.jdbc.Driver
步骤 3: 配置数据源 Bean 和 MyBatis
在Spring配置类中配置两个数据源和对应的SqlSessionFactory
:
@Configuration
public class DataSourceConfig {@Bean(name = "primaryDataSource")@ConfigurationProperties(prefix = "spring.datasource.primary")public DataSource primaryDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "auditDataSource")@ConfigurationProperties(prefix = "spring.datasource.audit")public DataSource auditDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "primarySqlSessionFactory")public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource)throws Exception {SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();sessionFactory.setDataSource(dataSource);return sessionFactory.getObject();}@Bean(name = "auditSqlSessionFactory")public SqlSessionFactory auditSqlSessionFactory(@Qualifier("auditDataSource") DataSource dataSource)throws Exception {SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();sessionFactory.setDataSource(dataSource);return sessionFactory.getObject();}
}
步骤 4: 动态数据源路由
实现一个简单的动态数据源路由可以通过扩展AbstractRoutingDataSource
:
public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return DataSourceContext.getCurrentDataSource();}
}
这里的DataSourceContext
是一个管理数据源键(比如线程本地变量)的工具类,它决定了当前线程应该使用哪个数据源。
步骤 5: 配置和使用
最后,你需要在业务逻辑中根据需要切换数据源。这通常是通过在服务层方法上使用注解或直接调用DataSourceContext
来设置数据源。
这个示例提供了多数据源配置的基本框架,你可以根据实际需求调整和扩展,例如添加事务管理器配置、优化连接池设置等。
7. 简化多数据源管理-dynamic
dynamic-datasource-spring-boot-starter
是一个用于 Spring Boot 应用的数据源管理框架。它不仅是一个简单的组件,而是一个完整的解决方案,旨在简化多数据源的配置和管理。这个框架提供了在运行时动态切换数据源的能力,这对于需要连接到多个数据库的应用程序来说非常有用,特别是在需要实现读写分离或连接到不同类型数据库的场景中。
功能和特点
dynamic-datasource-spring-boot-starter
的主要功能和特点包括:
- 简化多数据源配置:通过在 Spring Boot 应用的配置文件中声明多个数据源,使得配置变得简单直观。
- 动态数据源切换:提供了基于方法或类的注解(如
@DS
),允许开发者轻松指定哪个数据源应该被用于特定的操作。 - 灵活的数据源路由:支持基于业务逻辑动态选择数据源,例如根据用户的请求参数或其他逻辑来切换数据源。
- 支持主从复制:非常适合实现数据库的读写分离,提高数据库操作的效率和性能。
- 与 Spring 生态系统的集成:与 Spring Boot 和 Spring Data JPA 等其他 Spring 组件良好集成,使得它可以无缝地与现有的 Spring 应用协同工作。
应用场景
- 读写分离:在需要处理大量读操作和相对较少的写操作的应用中,可以将读操作指向从数据库,而写操作指向主数据库。
- 性能和可用性:通过分散请求到多个数据源,可以提高应用的响应时间和整体性能。
- 数据隔离:在多租户系统中,每个租户可能需要独立的数据库。使用
dynamic-datasource-spring-boot-starter
可以轻松管理每个租户的数据源。
总之,dynamic-datasource-spring-boot-starter
是一个功能强大的多数据源管理框架,非常适用于需要高度灵活性和强大数据源管理功能的复杂应用程序。它通过简化配置和增加运行时数据源切换的能力,极大地提高了开发效率和应用性能。
引入依赖
首先,确保你的 Spring Boot 项目中已经添加了 dynamic-datasource-spring-boot-starter
的依赖。如果还没有添加,可以在 pom.xml
中加入以下依赖:
<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>版本</version>
</dependency>
版本根据实际项目的依赖版本选择
配置多数据源
在 application.yml
或 application.properties
文件中配置多个数据源。例如,使用 YAML 格式配置如下:
spring:datasource:dynamic:primary: master # 设置主数据源datasource:master:url: jdbc:mysql://localhost:3306/master_dbusername: rootpassword: passworddriver-class-name: com.mysql.cj.jdbc.Driverslave:url: jdbc:mysql://localhost:3306/slave_dbusername: rootpassword: passworddriver-class-name: com.mysql.cj.jdbc.Driver
使用 @DS 注解
@DS
是一个用于多数据源分离的注解,提供了在同一个应用中同时使用多个数据源的能力。这个注解属于 dynamic-datasource-spring-boot-starter
库,用于在 Spring Boot 应用中动态管理多个数据源。下面是关于如何使用 @DS
注解的一些基本信息和示例。
在方法上使用
import com.baomidou.dynamic.datasource.annotation.DS;@Service
public class SomeService {@DS("master")public void writeToMaster() {// 这里的操作会使用配置中的 master 数据源}@DS("slave")public void readFromSlave() {// 这里的操作会使用配置中的 slave 数据源}
}
在类上使用
如果一个类中的所有方法都应该使用同一个数据源,可以将 @DS
注解放在类级别:
import com.baomidou.dynamic.datasource.annotation.DS;@DS("slave")
@Service
public class ReadOnlyService {// 所有方法都将使用 slave 数据源public void queryData() {// ...}
}
注意事项
- 确保数据源的键(如
master
和slave
)与你在配置文件中定义的名称相匹配。 - 使用
@DS
注解时,动态数据源会在方法调用前切换到指定的数据源,并在方法执行完毕后切换回原来的数据源。 - 考虑事务管理的策略,特别是在使用多数据源时,可能需要配置多个事务管理器。
通过这种方式,@DS
注解为处理多数据源提供了一个非常灵活和强大的机制,使得在同一个应用中根据业务需要选择不同的数据源变得简单和直接。
相关文章:

【springboot】 多数据源实现
文章目录 1. 引言:多数据源的必要性和应用场景**为什么需要多数据源?****应用场景** 2. Spring Boot中的数据源配置2.1 默认数据源配置简介2.2 如何在Spring Boot中配置多个数据源 3. 整合MyBatis与多数据源**配置MyBatis使用多数据源****Mapper接口的数…...

多模态COGMEN详解
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...

django 实战(python 3.x/django 3/sqlite)
要在 Python 3.x 环境中使用 Django 3.2 和 SQLite 创建一个新的 Django 项目,你可以按照以下步骤进行操作。这些步骤假设你已经安装了 Python 3.x 和 pip。 1. 设置虚拟环境 首先,建议为你的 Django 项目创建一个虚拟环境,以便隔离项目的依…...

图数据库 | 12、图数据库架构设计——高性能计算架构
在传统类型的数据库架构设计中,通常不会单独介绍计算架构,一切都围绕存储引擎展开,毕竟存储架构是基础,尤其是在传统的基于磁盘存储的数据库架构设计中。 类似地,在图数据库架构设计中,项目就围绕存储的方…...

Unity 利用Button 组件辅助Scroll View 滚动
实现 创建枚举类ScrollDir 以区分滚动方向。每组两个按钮负责同方向上左右/上下滚动。 Update 中实时获取Scroll View 滚动条当前位置。 if (dir.Equals(ScrollDir.vertical)) {posCurrent scroll.verticalNormalizedPosition; } else if (dir.Equals(ScrollDir.horizontal)…...

Ubuntu 安装Ansible ansible.cfg配置文件生成
安装后的ansible.cfg后的默认内容如下: rootlocalhost:/etc/ansible# cat ansible.cfg # Since Ansible 2.12 (core): # To generate an example config file (a "disabled" one with all default settings, commented out): # $ ansible-…...

使用PaddlePaddle实现线性回归模型
目录 编辑 引言 PaddlePaddle简介 线性回归模型的构建 1. 准备数据 2. 定义模型 3. 准备数据加载器 4. 定义损失函数和优化器 5. 训练模型 6. 评估模型 7. 预测 结论 引言 线性回归是统计学和机器学习中一个经典的算法,用于预测一个因变量࿰…...

MongoDB集群的介绍与搭建
MongoDB集群的介绍与搭建 一.MongoDB集群的介绍 注意:Mongodb是一个比较流行的NoSQL数据库,它的存储方式是文档式存储,并不是Key-Value形式; 1.1集群的优势和特性 MongoDB集群的优势主要体现在以下几个方面: (1)高…...

PhpStorm配置Laravel
本文是2024最新的通过phpstorm创建laravel项目 1.下载phpstorm 2.检查本电脑的环境phpcomposer 显示图标就是安装成功了,不会安装的百度自行安装 3.安装完后,自行创建一个空目录不要有中文,然后运行cmd 输入以下命令,即可创建…...

Solving the Makefile Missing Separator Stop Error in VSCode
1. 打开 Makefile 并转换缩进 步骤 1: 在 VSCode 中打开 Makefile 打开 VSCode。使用文件浏览器或 Ctrl O(在 Mac 上是 Cmd O)打开你的 Makefile。 步骤 2: 打开命令面板 按 Ctrl Shift P(在 Mac 上是 Cmd Shift P)&…...

MySQL大小写敏感、MySQL设置字段大小写敏感
文章目录 一、MySQL大小写敏感规则二、设置数据库及表名大小写敏感 2.1、查询库名及表名是否大小写敏感2.2、修改库名及表名大小写敏感 三、MySQL列名大小写不敏感四、lower_case_table_name与校对规则 4.1、验证校对规则影响大小写敏感4.1、验证校对规则影响排序 五、设置字段…...

项目搭建:guice,jdbc,maven
当然,以下是一个使用Guice、JDBC和Maven实现接口项目的具体例子。这个项目将展示如何创建一个简单的用户管理应用,包括用户信息的增删改查(CRUD)操作。 ### 1. Maven pom.xml 文件 首先确保你的pom.xml文件包含必要的依赖&#…...

第四届新生程序设计竞赛正式赛(C语言)
A: HNUCM的学习达人 SQ同学是HNUCM的学习达人,据说他每七天就能够看完一本书,每天看七分之一本书,而且他喜欢看完一本书之后再看另外一本。 现在请你编写一个程序,统计在指定天数中,SQ同学看完了多少本完整的书&#x…...

【分布式知识】Redis6.x新特性了解
文章目录 Redis6.x新特性1. 多线程I/O处理2. 改进的过期算法3. SSL/TLS支持4. ACL(访问控制列表)5. RESP3协议6. 客户端缓存7. 副本的无盘复制8. 其他改进 Redis配置详解1. 基础配置2. 安全配置3. 持久化配置4. 客户端与连接5. 性能与资源限制6. 其他配置…...

程序员需要具备哪些知识?
程序员需要掌握的知识广泛而深厚,这主要取决于具体从事的领域和技术方向。不过,有些核心知识是共通的,就像建房子的地基一样,下面来讲讲这些关键领域: 1. 编程语言: 无论你是搞前端、后端、移动开发还是嵌…...

实验四:MyBatis 的关联映射
目录: 一 、实验目的: 熟练掌握实体之间的各种映射关系。 二 、预习要求: 预习数据库原理中所讲过的一对一、一对多和多对多关系 三、实验内容: 1. 查询所有订单信息,关联查询下单用户信息(注意:因为一…...

【Leetcode】189.轮转数组
题目链接: 189.轮转数组 题目描述: 解题思路: 要想实现数组元素向右轮转k个位置,可是将数组三次反转来实现 以 nums [1,2,3,4,5,6,7], k 3 为例,最终要得到[5,6,7,1,2,3,4]: 第一次反转:将整个数组反转…...

【JavaSE】常见面试问题
1. 什么是 Java 中的多态? 多态是 Java 中面向对象的核心特性之一,指的是同一操作作用于不同类型的对象时表现出不同的行为。通过方法重载和方法重写实现。方法重载是同一方法名,根据参数不同做不同处理,属于编译时多态ÿ…...

【超详图文】多少样本量用 t分布 OR 正态分布
文章目录 相关教程相关文献预备知识Lindeberg-Lvy中心极限定理 t分布的来历实验不同分布不同抽样次数的总体分布不同自由度相同参数的t分布&正态分布 作者:小猪快跑 基础数学&计算数学,从事优化领域7年,主要研究方向:MIP求…...

leetcode hot100【Leetcode 416.分割等和子集】java实现
Leetcode 416.分割等和子集 题目描述 给定一个非负整数的数组 nums ,你需要将该数组分割成两个子集,使得两个子集的元素和相等。如果可以分割,返回 true ,否则返回 false。 示例 1: 输入:nums [1,5,11,…...

《算法导论》英文版前言To the teacher第4段研习录:有答案不让用
【英文版】 Departing from our practice in previous editions of this book, we have made publicly available solutions to some, but by no means all, of the problems and exercises. Our Web site, http://mitpress.mit.edu/algorithms/, links to these solutions. Y…...

Laravel关联模型查询
一,多表关联 文章表articles 和user_id,category_id关联 //with()方法是渴求式加载,缓解了1N的查询问题,仅需11次查询就能解决问题,可以提升查询速度。with部分没有就以null输出,所以可以理解为 多表 left join 查…...

Clickhouse 数据类型
文章目录 字符串类型数值类型日期时间类型枚举类型数组类型元组类型映射类型其它类型 字符串类型 数据类型描述备注String可变长度字符串无长度限制,适用于存储任意字符FixedString固定长度字符串定长字符串,长度在创建时指定,如 FixedStrin…...

物联网智能项目如何实现设备高效互联与数据处理?
一、硬件(Hardware) 设备互联的基础,涵盖传感器、执行器、网关和边缘计算设备。 传感器与执行器 功能: 采集环境数据(如温度、湿度、运动等)并执行控制命令。优化方向: 低功耗、高精度传感器以…...

【云服务器】搭建博客服务
未完待续 一、云服务器二、1panel安装及其容器三、Halo博客 一、云服务器 选择了狗云服务器:狗云-高性价比的服务器 安装系统:Ubuntu22.04 前期配置: 修改ssh端口: 二、1panel安装及其容器 三、Halo博客 主题:butt…...

如何抽象策略模式
策略模式是什么 策略设计模式(Strategy Pattern)是一种面向对象设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。这种模式使得算法可以独立于使用它们的客户端而变化。 策略设计模式包含三个主…...

BERT模型的输出格式探究以及提取出BERT 模型的CLS表示,last_hidden_state[:, 0, :]用于提取每个句子的CLS向量表示
说在前面 最近使用自己的数据集对bert-base-uncased进行了二次预训练,只使用了MLM任务,发现在加载训练好的模型进行输出CLS表示用于下游任务时,同一个句子的输出CLS表示都不一样,并且控制台输出以下警告信息。说是没有这些权重。…...

node.js实现分页,jwt鉴权机制,token,cookie和session的区别
文章目录 1. 分⻚功能2. jwt鉴权机制1.jwt是什么2.jwt的应用3.优缺点 3. cookie,token,session的对比 1. 分⻚功能 为什么要分页 如果数据量很⼤,⽐如⼏万条数据,放在⼀个⻚⾯显⽰的话显然不友好,这时候就需要采⽤分⻚…...

34 基于单片机的指纹打卡系统
目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52RC,采用两个按键替代指纹,一个按键按下,LCD12864显示比对成功,则 采用ULN2003驱动步进电机转动,表示开门,另一个…...

【Linux】用户操作命令
声明:以下内容均学习自《Linux就该这么学》一书 1、管理员root Linux系统的管理员之所以是root,并不是因为它的名字叫root,而是因为该用户的身份号码UID(User IDentification)的数值是0。UID相当于身份证号码&#x…...