Spring Boot 集成多数据源实战:轻松应对复杂数据场景

Spring Boot 集成多数据源实战:轻松应对复杂数据场景

在现代企业级应用开发中,常常会遇到需要连接多个不同数据源的情况。例如,一个系统可能既要访问业务数据库存储核心数据,又要对接外部系统的数据库获取补充信息,或者在数据迁移、读写分离等场景下,也离不开多数据源的支持。Spring Boot 凭借其强大的生态和便捷的配置方式,让多数据源集成变得不再复杂。今天,我们就深入探讨如何在 Spring Boot 项目中集成多数据源。

一、项目准备

首先,创建一个 Spring Boot 项目。你可以使用 Spring Initializr(https://start.spring.io/)快速搭建基础框架,选择所需的依赖,如 WebMyBatis(假设使用 MyBatis 作为持久层框架,当然你也可以选用 JPA 等其他持久化方案,原理类似)等。引入相关数据库驱动依赖,比如 MySQL 的驱动 mysql-connector-java 等,确保项目能与数据源正常通信。

二、配置数据源

  1. 主数据源配置
    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 数据库。

  1. 次数据源配置
    接着配置第二个数据源:
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、用户名、密码、驱动)要根据实际情况准确填写。

三、数据源配置类编写

  1. 主数据源配置类
    创建 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 来管理主数据源事务,保证数据操作的一致性。
  1. 次数据源配置类
    类似地,创建 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 多数据源集成难题,开启高效开发之旅。

以上代码示例仅供参考,实际应用中根据项目结构、数据库类型等情况适当调整,如有错误或不足之处,欢迎指正交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值