ShardingSphere-JDBC 分库分表

这篇具有很好参考价值的文章主要介绍了ShardingSphere-JDBC 分库分表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

springBoot  引入maven

            <dependency>
                <groupId>org.apache.shardingsphere</groupId>
                <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
                <version>4.0.0-RC1</version>
            </dependency>

application.yml配置

spring:
  shardingsphere:
    datasource:
      names: db1,db2
      db1:
        url: jdbc:mysql://localhost:3306/db1?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
        username: root
        password: root
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource
      db2:
        url: jdbc:mysql://localhost:3306/db2?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
        username: root
        password: root
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource
#      masterslave:
#        # 读写分离配置
#        load-balance-algorithm-type: round_robin #负载均衡策略,round_robin是轮循
#        # 最终的数据源名称
#        name: dataSource #就是bean的名字
#        # 主库数据源名称
#        master-data-source-name: db1
#        # 从库数据源名称列表,多个逗号分隔
#        slave-data-source-names: db2
    sharding:
      default-database-strategy:
        inline:
          sharding-column: order_id #数据库分片策略字段
          algorithm-expression: db${order_id % 2+1} # 配置t_order表分表策略
      tables:
        t_order:
          actual-data-nodes: db$->{1..2}.t_order_$->{0..3}  #配置t_order表分库策略(inline-基于行表达式的分片算法)
          table-strategy:
            inline:  #只适合一个字段 
              sharding-column: order_id   #分表策略字段
              algorithm-expression: t_order_$->{order_id % 2}  #根据order_id%2 找到对应表名
          key-generator:
            column: order_id
            type: SNOWFLAKE
    props:
      sql:
        show: true #打印sql

table-strategy:指定表的分片策略,table-strategy有以下几种策略

1 ) none 表示不分片,所有数据都存储在同一个表中。

2 ) standard 表示使用标准分片策略,根据分片键的值进行范围匹配,将数据路由到对应的分片表中。

        对应StandardShardingStrategy,标准分片策略,根据分片键的值进行范围匹配,将数据路由到对应的分片表中,提供对SQL语句中的=, >, <, >=, <=, IN和BETWEEN AND的分片操作支持。StandardShardingStrategy只支持单分片键,提供PreciseShardingAlgorithm和RangeShardingAlgorithm两个分片算法。PreciseShardingAlgorithm是必选的,用于处理=和IN的分片。RangeShardingAlgorithm是可选的,用于处理BETWEEN AND, >, <, >=, <=分片,如果不配置RangeShardingAlgorithm,SQL中的BETWEEN AND将按照全库路由处理。

配置standard策略,我们需要实现PreciseShardingAlgorithm和RangeShardingAlgorithm接口来自定义自己的分片算法,如下所示

application.yml配置

      tables:
t_order:
actual-data-nodes: db$->{1..2}.t_order_$->{0..3} #配置t_order表分库策略(inline-基于行表达式的分片算法)
table-strategy:
standard:
sharding-column: order_id
precise-algorithm-class-name: com.zjf.web.config.standard.MyTablePreciseShardingAlgorithm

分片类

@Component
@Slf4j
public class MyPreciseShardingAlgorithm implements PreciseShardingAlgorithm<Integer> {
    /**
     * @param tableNames 对应分片库中所有分片表的集合
     * @param shardingValue 为分片属性,logicTableName 为逻辑表,columnName 分片键,value 为从 SQL 中解析出来的分片键的值
     * @return
     */
    @Override
    public String doSharding(Collection<String> tableNames, PreciseShardingValue<Integer> shardingValue) {
        for (String tableName : tableNames) {
            // 取模算法,分片键 % 表数量
            String value = String.valueOf(shardingValue.getValue() % tableNames.size() );
            log.info("tableName {} value============ {}",tableName,value);
            if (tableName.endsWith(value)) {
                return tableName;
            }
        }
        throw new IllegalArgumentException("分片失败,tableNames:" + tableNames);
    }
}

3 ) inline 表示使用行表达式分片策略,根据分片键的值通过表达式计算得到分片结果,将数据路由到对应的分片表中。

           对应InlineShardingStrategy,使用Groovy的表达式,提供对SQL语句中的=和IN的分片操作支持,只支持单分片键。对于简单的分片算法,可以通过简单的配置使用

      tables:
        t_order:
          actual-data-nodes: db$->{1..2}.t_order_$->{0..3}
          table-strategy:
            inline:
              sharding-column: order_id
              algorithm-expression: t_order_$->{order_id % 2}

4 ) complex 表示使用复合分片策略,可以同时使用多个分片键对数据进行分片计算,将数据路由到对应的分片表中。

        对应ComplexShardingStrategy。复合分片策略。提供对SQL语句中的=, >, <, >=, <=, IN和BETWEEN AND的分片操作支持,ComplexShardingStrategy支持多分片键,如果表是多分片键的,那么需要使用该策略

       使用complex 策略,需要我们自定义一个ComplexShardingAlgorithm实现类,在该实现类定义相关分片算法

@Slf4j
public class MyComplexShardingAlgorithm implements ComplexKeysShardingAlgorithm {
    /**
     *
     * @param availableTargetNames 进行分片的表
     * @param shardingValue 
     * @return
     */
    @Override
    public Collection<String> doSharding(Collection availableTargetNames, ComplexKeysShardingValue shardingValue) {
        List<String> result = new ArrayList<>();

        // 获取分片键列和对应的分片键值
        Map<String, Collection<Long>> columnNameAndShardingValuesMap = shardingValue.getColumnNameAndShardingValuesMap();

        // 遍历分片键列和分片键值
        for (Map.Entry<String, Collection<Long>> entry : columnNameAndShardingValuesMap.entrySet()) {
            String columnName = entry.getKey();
            Collection<Long> shardingValues = entry.getValue();
            log.info("分片键:"+columnName);
            // 根据分片键列和分片键值进行分片逻辑的实现
            for (Long shardingVal : shardingValues) {
                for (Object availableTargetName : availableTargetNames) {
                    String tableName = availableTargetName.toString();
                    String value = String.valueOf(shardingVal % availableTargetNames.size() );
                    if (tableName.endsWith(value)) {
                        result.add(tableName) ;
                    }
                }
            }
        }
        return result;
    }
}

 文章来源地址https://www.toymoban.com/news/detail-805648.html

到了这里,关于ShardingSphere-JDBC 分库分表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot 整合 ShardingSphere4.1.1实现分库分表

    目录 前言 一、ShardingSphere4.1.1的spring boot配置 二、ShardingSphere的分片策略 三、SpringBoot 整合 ShardingSphere4.1.1 四 、ShardingSphere实现分布式事务控制     ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这

    2024年02月08日
    浏览(40)
  • shardingsphere5.x整合springboot分库分表实战

    官方文档不同版本配置变更记录:Spring Boot Start 配置 :: ShardingSphere pom.xml配置: 建表sql: yml配置: orders对象实体: OrdersMapper:  OrdersMapper.xml:  单元测试:  1、插入数据结果,按order_no分片取模,分片数为10,该数据被写入表orders_2: 2、查询数据sql,按order_no分片取模,分

    2024年02月07日
    浏览(42)
  • 基于springboot的ShardingSphere5.2.1的分库分表的解决方案之分表解决方案(一)

    5.2.1版本已经于2022年10月18日正式发布了,相较于之前的5.0.0版本,该版本大幅度提升了性能,同时修复了大量的遗留ISSUE,且增加了很多新特性,因此在此版本发布之际,将原先基于5.0.0版本的例子基于5.2.1进行了一次梳理,接下来将为大家一 一梳理5.2.1版本的内容。 打开我们

    2024年02月01日
    浏览(50)
  • ShardingSphere-JDBC学习

    springBoot  引入maven application.yml配置 table-strategy:指定表的分片策略,table-strategy有以下几种策略 1 ) none 表示不分片,所有数据都存储在同一个表中。 2 ) standard 表示使用标准分片策略,根据分片键的值进行范围匹配,将数据路由到对应的分片表中。         对应StandardShardi

    2024年01月19日
    浏览(56)
  • Java微服务系列之 ShardingSphere - ShardingSphere-JDBC

    🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 [Java项目实战] 介绍Java组件安装、使用;手写框架等 [Aws服务器实战] Aws Linux服务器上操作nginx、git、JDK、Vue等 [Java微服务

    2024年02月02日
    浏览(45)
  • springboot~sharding-jdbc实现分库分表

    当mysql数据库单表大于1千万以后,查询的性能就不能保证了,我们必须考虑分库,分表的方案了,还好,sharding-jdbc可以很优雅的与springboot对接,完成对mysql的分库和分表。 为了不影响其它小容量的表,所有添加了动态数据源,只对需要分库分表的进行配置即可 com.baomidou:dy

    2024年02月06日
    浏览(47)
  • ShardingSphere-JDBC-若依框架集成

    ShardingSphere基础知识、ShardingSphere-JDBC如何集成进若依框架中 使用的是若依框架(SpringBoot)前后端版本、动态数据源,可自行切换,默认数据源为达梦8 官网文档地址:https://shardingsphere.apache.org/document/current/cn/overview/ 简介 开源的分布式数据库中间件解决方案组成的生态圈 关系

    2024年02月09日
    浏览(82)
  • springboot~对应sharding-jdbc实现分库分表

    当mysql数据库单表大于1千万以后,查询的性能就不能保证了,我们必须考虑分库,分表的方案了,还好,sharding-jdbc可以很优雅的与springboot对接,完成对mysql的分库和分表。 为了不影响其它小容量的表,所有添加了动态数据源,只对需要分库分表的进行配置即可 com.baomidou:dy

    2024年02月06日
    浏览(37)
  • 【分库分表】基于mysql+shardingSphere的分库分表技术

    目录 1.什么是分库分表 2.分片方法 3.测试数据 4.shardingSphere 4.1.介绍 4.2.sharding jdbc 4.3.sharding proxy 4.4.两者之间的对比 5.留个尾巴 分库分表是一种场景解决方案,它的出现是为了解决一些场景问题的,哪些场景喃? 单表过大的话,读请求进来,查数据需要的时间会过长 读请求过

    2024年03月12日
    浏览(48)
  • springboot整合sharding-jdbc实现分库分表详解

    目录 一、为什么需要分库分表 1.1 分库分表的优势 二、分库分表基本概念 2.1 垂直分表

    2024年02月05日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包