Spring Boot 集成多数据源实战:轻松应对复杂数据场景
在现代企业级应用开发中,常常会遇到需要连接多个不同数据源的情况。例如,一个系统可能既要访问业务数据库存储核心数据,又要对接外部系统的数据库获取补充信息,或者在数据迁移、读写分离等场景下,也离不开多数据源的支持。Spring Boot 凭借其强大的生态和便捷的配置方式,让多数据源集成变得不再复杂。今天,我们就深入探讨如何在 Spring Boot 项目中集成多数据源。
一、项目准备
首先,创建一个 Spring Boot 项目。你可以使用 Spring Initializr(https://start.spring.io/)快速搭建基础框架,选择所需的依赖,如 Web
、MyBatis
(假设使用 MyBatis 作为持久层框架,当然你也可以选用 JPA 等其他持久化方案,原理类似)等。引入相关数据库驱动依赖,比如 MySQL 的驱动 mysql-connector-java
等,确保项目能与数据源正常通信。
二、配置数据源
- 主数据源配置
在application.properties
(或application.yml
,本文以.yml
为例)中,配置主数据源的连接信息:
spring:
datasource:
primary:
url: jdbc:mysql://localhost:3306/primary_db?useUnicode=true&characterEncoding=utf8&useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
这里定义了一个名为 primary
的数据源连接到本地的 primary_db
数据库。
- 次数据源配置
接着配置第二个数据源:
spring:
datasource:
secondary:
url: jdbc:mysql://localhost:3306/secondary_db?useUnicode=true&characterEncoding=utf8&useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
指向了另一个 secondary_db
数据库,注意,两个数据源的关键配置项(如 URL、用户名、密码、驱动)要根据实际情况准确填写。
三、数据源配置类编写
- 主数据源配置类
创建PrimaryDataSourceConfig
类:
@Configuration
@MapperScan(basePackages = "com.example.demo.mapper.primary", sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryDataSourceConfig {
@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
@Primary
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "primarySqlSessionFactory")
public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
// 这里可以设置 MyBatis 的其他配置,如 mapperLocations 等
return factoryBean.getObject();
}
@Bean(name = "primaryTransactionManager")
public DataSourceTransactionManager primaryTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
这个配置类做了几件关键的事:
- 通过
@MapperScan
扫描主数据源对应的 Mapper 接口所在包,确保 MyBatis 能正确关联。 - 使用
@ConfigurationProperties
结合配置文件中的primary
前缀,加载主数据源配置创建数据源primaryDataSource
,并标记为@Primary
,表示这是默认数据源,当没有指定数据源时,Spring 会使用它。 - 构建
primarySqlSessionFactory
用于创建 MyBatis 的会话工厂,传入主数据源,让 MyBatis 能操作主数据库。 - 生成
primaryTransactionManager
来管理主数据源事务,保证数据操作的一致性。
- 次数据源配置类
类似地,创建SecondaryDataSourceConfig
类:
@Configuration
@MapperScan(basePackages = "com.example.demo.mapper.secondary", sqlSessionFactoryRef = "secondarySqlSessionFactory")
public class SecondaryDataSourceConfig {
@Bean(name = "secondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondarySqlSessionFactory")
public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
return factoryBean.getObject();
}
@Bean(name = "secondaryTransactionManager")
public DataSourceTransactionManager secondaryTransactionManager(@Qualifier("secondaryDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
这里的逻辑与主数据源配置类相似,只是扫描不同的 Mapper 包,创建对应次数据源的相关组件,并且没有 @Primary
注解,因为它不是默认数据源。
四、使用多数据源
假设我们有两个 Mapper 接口,分别对应主、次数据源:
// 主数据源 Mapper
@Mapper
public interface PrimaryUserMapper {
User findUserById(Long id);
}
// 次数据源 Mapper
@Mapper
public interface SecondaryOrderMapper {
List<Order> getOrdersByUserId(Long userId);
}
在 Service 层使用时:
@Service
public class UserService {
@Autowired
private PrimaryUserMapper primaryUserMapper;
@Autowired
@Qualifier("secondaryOrderMapper")
private SecondaryOrderMapper secondaryOrderMapper;
public User getUserWithOrders(Long userId) {
User user = primaryUserMapper.findUserById(userId);
if (user!= null) {
List<Order> orders = secondaryOrderMapper.getOrdersByUserId(userId);
user.setOrders(orders);
}
return user;
}
}
通过 @Autowired
和 @Qualifier
精确指定要注入的 Mapper,实现了从不同数据源获取数据并进行业务逻辑整合。这里只是一个简单示例,实际场景可能更复杂,如跨数据源的事务处理等,但基本架构搭建完成后,后续扩展也有章可循。
Spring Boot 集成多数据源,关键在于合理配置数据源、创建对应的持久层组件以及在业务代码中精准调用。这种方式让我们的应用能灵活对接多个数据存储,充分利用各种数据资源,满足多样化的业务需求,为复杂系统开发提供坚实的数据基础支撑。希望这篇文章能助你顺利攻克 Spring Boot 多数据源集成难题,开启高效开发之旅。
以上代码示例仅供参考,实际应用中根据项目结构、数据库类型等情况适当调整,如有错误或不足之处,欢迎指正交流。