首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

​SpringBoot多数据源实战:动态路由 vs 显式装配 vs 三方库魔法

一、核心方案对比

方案特点与适用场景:

动态路由:适合高频切换场景(如读写分离)

显式装配:适合独立操作不同库(如主业务库+日志库)

三方库方案:适合快速集成场景

二、动态数据源路由(AbstractRoutingDataSource)

动态路由架构

核心代码

// 1. 数据源上下文

public class DataSourceContext {

   private static final ThreadLocal<String> CONTEXT = new ThreadLocal<>();

   public static void set(String ds) { CONTEXT.set(ds); }

   public static String get() { return CONTEXT.get(); }

   public static void clear() { CONTEXT.remove(); }

}

// 2. 动态数据源

public class DynamicDataSource extends AbstractRoutingDataSource {

   @Override

   protected Object determineCurrentLookupKey() {

       return DataSourceContext.get();

  }

}

// 3. 配置类

@Configuration

@EnableTransactionManagement

public class DataSourceConfig {

   @Bean

   @ConfigurationProperties("spring.datasource.master")

   DataSource masterDataSource() {

       return DataSourceBuilder.create().build();

  }

   @Bean

   @ConfigurationProperties("spring.datasource.slave")

   DataSource slaveDataSource() {

       return DataSourceBuilder.create().build();

  }

   @Bean

   DataSource dynamicDataSource() {

       Map<Object, Object> targetDataSources = new HashMap<>();

       targetDataSources.put("master", masterDataSource());

       targetDataSources.put("slave", slaveDataSource());

       DynamicDataSource ds = new DynamicDataSource();

       ds.setTargetDataSources(targetDataSources);

       ds.setDefaultTargetDataSource(masterDataSource());

       return ds;

  }

   @Bean

   PlatformTransactionManager transactionManager() {

       return new DataSourceTransactionManager(dynamicDataSource());

  }

}

三、显式多数据源装配

显式多数据源

实现代码

@Configuration

public class MultiDataSourceConfig {

   @Primary

   @Bean("primaryDS")

   @ConfigurationProperties("spring.datasource.primary")

   public DataSource primaryDataSource() {

       return DataSourceBuilder.create().build();

  }

   @Bean("secondaryDS")

   @ConfigurationProperties("spring.datasource.secondary")

   public DataSource secondaryDataSource() {

       return DataSourceBuilder.create().build();

  }

   @Bean("primaryJdbc")

   public JdbcTemplate primaryJdbc(@Qualifier("primaryDS") DataSource ds) {

       return new JdbcTemplate(ds);

  }

   @Bean("secondaryJdbc")

   public JdbcTemplate secondaryJdbc(@Qualifier("secondaryDS") DataSource ds) {

       return new JdbcTemplate(ds);

  }

}

四、MyBatis-Plus多数据源插件

MyBatis-Plus多数据源

快速集成

添加依赖:

   <groupId>com.baomidou</groupId>

   <artifactId>dynamic-datasource-spring-boot-starter</artifactId>

   <version>3.5.1</version>

配置YAML:

spring:

datasource:

  dynamic:

    primary: master

    datasource:

      master:

        url: jdbc:mysql://localhost:3306/main

        username: root

        password: 123456

      slave:

        url: jdbc:mysql://192.168.1.100:3306/logs

        username: log_user

        password: log_pass

注解使用:

@Service

public class OrderService {

   @DS("master") // 默认数据源

   public void createOrder(Order order) {

       // 使用主库

  }

   @DS("slave")

   public List<Log> getLogs() {

       // 使用从库

  }

}

五、方案选型建议

避坑指南:

动态数据源需配合@Transactional(propagation = Propagation.NOT_SUPPORTED)使用

显式装配时注意事务管理器绑定

MyBatis-Plus多数据源不支持嵌套事务

选择最适合业务的方案,才是架构设计的真谛!

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O0SQNeSESjGjx5x366K1471Q0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券