spring boot 集成 shardingsphere

环境

  • spring boot 2.5.4

  • shardingsphere 4.1.1

  • jdk 1.8

引入依赖

    <properties>
        <java.version>1.8</java.version>
        <sharding-sphere.version>4.1.1</sharding-sphere.version>
    </properties>
    <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>${sharding-sphere.version}</version>
    </dependency>

    <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-namespace</artifactId>
            <version>${sharding-sphere.version}</version>
    </dependency>

准备2个数据库实例:ds0,ds1

示例

  • 普通表分库

    • 在数据库ds0和ds1中分别创建一张表(tab_order)
      CREATE TABLE `tab_order` (
      `order_id` bigint NOT NULL,
      `order_type` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
      PRIMARY KEY (`order_id`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
    • 在yml文件中进行shardingsphere的配置
    • 在测试代码中往tab_order表插入50条数据,会发现主键值为偶数的在数据库ds0中,为奇数的在数据库ds1中,并且数据均匀分布在两个库的tab_order中。
  • 关联表分库

    • 在数据库ds0和ds1中分别创建tab_order的子表tab_order_item
      CREATE TABLE `tab_order_item` (
      `item_id` bigint NOT NULL,
      `order_id` bigint DEFAULT NULL,
      `product_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
      PRIMARY KEY (`item_id`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
    • 在yml中进行shardingsphere的配置
    • 往子表中插入数据,会发现子表是根据主表的主键是否奇偶来进行分片的。
  • 分库且分表

    • 在数据库ds0和ds1中分别创建tabmetadata0、tabmetadata1、tabmetadata2三张数据结构相同的表,例
      CREATE TABLE `tabmetadata0` (
      `mid` bigint NOT NULL,
      `pubtile` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
      `source` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
      PRIMARY KEY (`mid`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
    • 在yml中进行shardingsphere的配置
    • 往表中注入数据,会发现所有主键为偶数的会在ds0数据库中,并且相对均匀分布在ds0中的tabmetadata0、tabmetadata1、tabmetadata2三张表中,所有主键为奇数的会在ds1中,也相对均匀的分布在ds1中的tabmetadata0、tabmetadata1、tabmetadata2三张表中
  • 广播表

    注释:指所有的分片数据源中都存在的表,表结构和表中的数据在每个数据库中均完全一致。适用于数据量不大且需要与海量数据的表进行关联查询的场景,例如:字典表
    • 在数据ds0和ds1中分别创建表tab_broadcast
      CREATE TABLE `tab_broadcast` (
      `broad_id` bigint NOT NULL AUTO_INCREMENT,
      `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
      PRIMARY KEY (`broad_id`)
      ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
    • 在yml中进行shardingsphere的配置
    • 往tab_broadcast表中注入数据,结果ds0与ds1数据库中的tab_broadcast数据是相同的。
  • 标准策略分库

    注释:以上示例均采用行表达式(inline)的策略进行分库或分表,下面采用standard策略进行分库
    • 在数据ds0和ds1中分别创建表tab_metadata_standard
      CREATE TABLE `tab_metadata_standard` (
      `mid` bigint NOT NULL,
      `pubtile` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
      `source` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
      PRIMARY KEY (`mid`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
    • 在yml中进行shardingsphere的配置
    • 创建类PreciseShardingDBAlgorithm 并实现接口PreciseShardingAlgorithm,重写doSharding方法,此方法自定义分库的规则,最终返回一个数据库源,例:
    • 往tab_metadata_standard表中注入数据,会均匀的将数据在布在ds0和ds1数据库中。
最后编辑: 呼丽华  文档更新时间: 2024-08-21 10:58   作者:鲁航