SpringBoot集成ShardingJDBC系列【4】—— 集成多数据源动态切换


文章只负责讲解sharding的相关配置,springboot其他的配置自己解决!!
文章内容将分开发布,便于平时查阅。


集成多数据源动态切换
  1. 为什么有了sharding还要配置多数据源?
    根据之前SpringBoot集成ShardingJDBC系列【2】—— 基于yaml基本配置这篇文章中提到过这个问题,对于只有部分数据库分库分表,为什么需要将不分库分表的表也配置在分片规则中。

因为ShardingSphere是将多个数据源合并为一个统一的逻辑数据源。因此即使不分库分表的部分,不配置分片规则ShardingSphere即无法精确的断定应该路由至哪个数据源。 但是ShardingSphere提供了两种变通的方式,有助于简化配置。

方法一:配置default-data-source,凡是在默认数据源中的表可以无需配置在分片规则中,ShardingSphere将在找不到分片数据源的情况下将表路由至默认数据源。
缺点:这种方法有一个致命的缺点,就是如果查询的表不在设置的默认数据源中,还是需要将表配置到分片规则中。除非你的需求是决定将所有不需要进行分片的表都放在默认数据源里,那么倒是可以这么做,否则你就得一个一个配置表的分片规则了。

方法2:将不参与分库分表的数据源独立于ShardingSphere之外,在应用中使用多个数据源分别处理分片和不分片的情况。
优点:将不分片的数据源独立出来,开发者可以通过多数据源自主选择处理不同情况,仅需要简单配置后加个注解即可。我接下来所要讲的就是这个!!!


  1. 添加多数据源的依赖和配置:
    这里选择的是baomidou团队开发的一个基于springboot的快速集成多数据源的启动器,详细文档可前往官方文档介绍

(1)依赖:

		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
			<version>${dynamic.datasource.version}</version>
		</dependency>		

		<sharding.jdbc.version>4.1.0</sharding.jdbc.version>

(2)配置:
这里创建一个新的application-dynamic-datasource.yml文件,然后在application.yml的spring:profiles:include:引入即可,编辑如下:

spring:
  datasource:
    dynamic:
      datasource:
        master:
          type: com.alibaba.druid.pool.DruidDataSource
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/sharding_test_1?useUnicode=true&useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
          username: root
          password: 123456

        slave:
          type: com.alibaba.druid.pool.DruidDataSource
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/sharding_test_2?useUnicode=true&useSSL=false&characterEncoding=utf8&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
          username: root
          password: 123456

      primary: master # 设置默认的数据源或者数据源组,默认值即为master
      strict: false # 设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源

(3)集成Sharding:从上面那一步完成后,我们便可以通过@DS()注解来动态的选择数据源了。但是,也只能使用上面的master和slave两个数据源。如果要集成Sharding的话,也就是将Sharding数据源也加入到dynamic-datasource的管理中来。直接贴代码:

/**
 * @author KLAY_
 * @date 2020/09/03 14:43
 */
@Configuration
@AutoConfigureBefore({DynamicDataSourceAutoConfiguration.class,
        SpringBootConfiguration.class})
public class DataSourceConfiguration {

    /**
     * 分表数据源名称
     */
    private static final String SHARDING_DATASOURCE_NAME = "sharding";

    /**
     * 动态数据源配置项
     */
    @Autowired
    private DynamicDataSourceProperties properties;

    /**
     * shardingjdbc有四种数据源,需要根据业务注入不同的数据源
     * 1. 未使用分片, 脱敏的名称(默认): shardingDataSource;
     * 2. 主从数据源: masterSlaveDataSource;
     * 3. 脱敏数据源:encryptDataSource;
     * 4. 影子数据源:shadowDataSource
     */
    @Lazy
    @Resource(name = "shardingDataSource")
    AbstractDataSourceAdapter shardingDataSource;

    @Bean
    public DynamicDataSourceProvider dynamicDataSourceProvider() {
        Map<String, DataSourceProperty> datasourceMap = properties.getDatasource();
        return new AbstractDataSourceProvider() {
            @Override
            public Map<String, DataSource> loadDataSources() {
                Map<String, DataSource> map = createDataSourceMap(datasourceMap);
                map.put(SHARDING_DATASOURCE_NAME, shardingDataSource);  /// 这里将shardingjdbc管理的数据源交给dynamic-datasource动态数据源去管理
                return map;
            }
        };
    }

    /**
     * 将dynamic-datasource动态数据源设置为首选的
     * 当spring存在多个数据源的时候,自动注入的是首选数据源
     * 这样之后可以支持sharding-jdbc原生的配置方式
     * @param dynamicDataSourceProvider
     * @return
     */
    @Primary
    @Bean
    public DataSource dataSource(DynamicDataSourceProvider dynamicDataSourceProvider) {
        DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource();
        dataSource.setPrimary(properties.getPrimary());
        dataSource.setStrict(properties.getStrict());
        dataSource.setStrategy(properties.getStrategy());
        dataSource.setProvider(dynamicDataSourceProvider);
        dataSource.setP6spy(properties.getP6spy());
        dataSource.setSeata(properties.getSeata());
        return dataSource;
    }

}

之后,我们对需要进行分片处理的表,则可以在类或者方法直接加上一个@DS(“sharding”)注解,即可进行分片处理;而对于不需要分片的表,我只需要@DS(“其他的数据源”)即可。


遇过的坑(注意):

@DS()注解的优先级上,方法优于类。

对于多数据源之间的事务、分布式事务,会存在一些问题。后续会再更新这一方便的。


事先说明,该系列下的所有文章均为作者查阅很多配置资料后整理得出,主要用于个人记录学习的配置资料不涉及原理,仅作参考。

  • 7
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot集成 Sharding-JDBC 可以通过以下步骤完成: 1. 添加相关依赖:首先,在项目的 `pom.xml` 文件中添加 Sharding-JDBC 的依赖。例如,可以添加如下依赖: ```xml <dependencies> <!-- Sharding-JDBC --> <dependency> <groupId>io.shardingjdbc</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>最新版本</version> </dependency> <!-- 数据库驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>最新版本</version> </dependency> </dependencies> ``` 2. 配置数据源:在项目的配置文件(例如 `application.yml` 或 `application.properties`)中,配置数据源的连接信息。可以配置主库和从库的数据源。例如: ```yaml spring: sharding: jdbc: datasource: names: ds-master, ds-slave1, ds-slave2 ds-master: url: jdbc:mysql://localhost:3306/db_master?useSSL=false&characterEncoding=utf8 username: root password: password driver-class-name: com.mysql.jdbc.Driver ds-slave1: url: jdbc:mysql://localhost:3306/db_slave1?useSSL=false&characterEncoding=utf8 username: root password: password driver-class-name: com.mysql.jdbc.Driver ds-slave2: url: jdbc:mysql://localhost:3306/db_slave2?useSSL=false&characterEncoding=utf8 username: root password: password driver-class-name: com.mysql.jdbc.Driver ``` 3. 配置 Sharding-JDBC:在项目的配置类中,使用 `@Configuration` 注解标记该类为配置类,并使用 `@EnableConfigurationProperties` 注解引入 Sharding-JDBC 的配置属性。然后,通过 `ShardingRuleConfiguration` 配置数据分片规则,例如指定分片策略、分片键等信息。最后,通过 `ShardingDataSource` 创建数据源,并将其注入到 Spring 容器中。例如: ```java @Configuration @EnableConfigurationProperties(ShardingProperties.class) public class ShardingJdbcConfig { @Autowired private ShardingProperties shardingProperties; @Bean public DataSource dataSource() throws SQLException { ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); // 配置分片表规则 TableRuleConfiguration tableRuleConfig = new TableRuleConfiguration(); tableRuleConfig.setLogicTable("your_table"); tableRuleConfig.setActualDataNodes("ds-master.your_table_${0..1}, ds-slave.your_table_${0..1}"); // 配置分片算法 InlineShardingStrategyConfiguration shardingStrategyConfig = new InlineShardingStrategyConfiguration(); shardingStrategyConfig.setShardingColumn("id"); shardingStrategyConfig.setAlgorithmExpression("your_table_${id % 2}"); tableRuleConfig.setTableShardingStrategyConfig(shardingStrategyConfig); shardingRuleConfig.getTableRuleConfigs().add(tableRuleConfig); // 创建 ShardingDataSource return ShardingDataSourceFactory.createDataSource( shardingProperties.getDataSourceMap(), shardingRuleConfig, new Properties() ); } } ``` 4. 使用 Sharding-JDBC:在 Service 或 Repository 类中,使用 `@Autowired` 注解注入数据源,并使用 SQL 操作数据库。Sharding-JDBC 会根据配置的分片规则自动将数据分发到对应的数据源上。例如: ```java @Service public class UserService { @Autowired private DataSource dataSource; public List<User> getUsers() { // 使用 dataSource 执行查询操作 // ... } public void addUser(User user) { // 使用 dataSource 执行插入操作 // ... } // 其他方法... } ``` 以上就是在 Spring Boot集成 Sharding-JDBC 的步骤。配置完成后,你可以在需要使用数据库的地方注入数据源并进行数据库操作。请注意,以上示例是基于 Sharding-JDBC 4.x 版本的,如果你使用的是其他版本,请相应调整配置方式。另外,示例中的配置是基于 MySQL 数据库的,如果你使用的是其他数据库,请相应调整数据库驱动和连接信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值