zl程序教程

您现在的位置是:首页 >  其他

当前栏目

shardingJdbc专题系列(四)之Inline策略分表

2023-04-18 12:30:54 时间

上篇文章我们演示了使用sharding-jdbc进行分库操作的一个小案例, 采用的是inline模式,也就是在yml配置文件中,通过配置分片算法表达式,来进行分片,也简单体验了一下。其实相对来讲还是比较简单的,这些配置也不用背下来,大家只要做好笔记,用的时候,能够根据自己的业务进行套用就行了。当然如果怕记不住,欢迎关注我,或者收藏我的文章,用的时候过来翻翻就可以了。

那么本篇文章我们接着上篇文章继续,来演示一下更常用的分表操作。为什么说分表更常用呢,因为一旦跨库,就需要解决分布式事务的问题,所以很多人不想徒增麻烦,甚至是分库后,可能导致的唯一id一致等问题,都是很头疼的。接下来进入分表。分表一般都是在一个库里进行操作。会有结构一致的表, 比如 t_order_1, t_order_2, 通过第一节的概念我们提到过,这些表叫做真实表, 他们结构一致, t_order是他们的逻辑表,当然逻辑表是可以不存在的。只是真实表结构的一个总称,并且我们进行查询的时候,只需要写 select * from t_order就行了, shardingJdbc会自动帮助我们去真实表中查询,并整合结果。

好的环境搭建:

我们还是在上篇文章的项目下继续展开,上篇文章已经给出了代码的脚手架。下载下来按照的步骤执行,就能够运行起来。

首先我们还是在 sharding-inline-yml的module下执行, 在resources 资源目录下重新添加一个配置文件 application-table.yml, 用于添加分表的配置,内容如下:

#分表
spring:
  shardingsphere:
    datasource:   #数据源配置
      names: ds0
      ds0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/ds0?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
        username: root
        password: root
    # 分表配置
    sharding:
      default-table-strategy:
        inline:
          sharding-column: user_id
          algorithm-expression: t_order_${user_id % 4 + 1}
      # 配置广播表
      broadcast-tables: t_user
      binding-tables: t_order,t_order_item
      tables:
        t_order:
          actual-data-nodes: ds0.t_order_$->{1..4}
          key-generator:
            column: order_id
            type: SNOWFLAKE
            props:
              worker:
                id: 123
          table-strategy:
            inline:
              sharding-column: user_id
              algorithm-expression: t_order_${user_id % 4 + 1}

这里可以看到,这次的数据源,我们只用了一个ds0,相当于只在这一个库中操作即可。主要看分表的配置: 首先是有一个默认的分表策略,还配置了一个广播表,和绑定表。广播表其实主要在分库的时候用,被配置成广播表的表,在插入的时候,会在多个分片(库)中同时插入一份。 比如一些字段表,或者配置表,在跨库时关联操作不方便,配置成广播表,各个库里就会都有一份内容完成一样。

tables下面就是对表的操作。不同的表可以配置不同的分片算法,建议所以需要分片的表,都要在下面配置,不分片的都配置成广播表。

我们这里只配了t_order表,当然还可以继续配置其他表。我们表的怎是节点表达式是: ds0.t_order_$->{1..4}

代表真实表为 t_order_1, t_order_2, t_order_3, t_order4, 那么到底是存到哪张表里呢,有下面的table-strategy, 表策略决定: 表策略首先给出inline, 代表使用inline策略:

分片列为: user_id

分片算法表达式: t_order_${user_id %4 +1} 根据user_id 对4取模后加1, 结果肯定格式1-4,来计算到底插入哪张表中。

好了,但是别忘了,在application.yml配置文件中指定使用application-table.yml的配置文件。

spring:
    profiles:
        active: table

然后继续执行主类,启动程序。 访问: localhost:9991/test/order, 向order中插入10条数据,user_id 从1到10;去库中观察结果,此时所有插入的数据都在ds0库中,分布在不同的表中;

好了很简单的分表就这样完成了。 你get到了么。

说一下大家执行的流程,只需要下载我篇文章的脚手架,然后导入数据库脚本,把配置文件按照文章中的步骤粘贴进去,就可以直接运行了。无需任何其他操作。

另外结合这两篇文章,大家可以测试一下同时分库分表应该怎么做,其实就是配置一下表达式就行了,把两篇文章结合一下即可。

好了这篇文章就到这了,下篇文章我们讲下,如果不想使用yml配置文件,想用java config的方式实现上述功能,代码应该怎么写。