为方便讨论,假设有下面2张订单表:t_order_vip(用于存放VIP的订单),t_order_normal(用于存放普通用户的订单)  -- 注:为了演示自定义分片算法而设想的场景,大家不必太纠结其真实性。

分片规则:根据user_id,假设user_id为1,2,3的为VIP用户,其它id为普通用户

5.x与4.x版本有几个明显不同的地方:

一、 5.x不再支持传统的XML配置方式,而是采用YAML格式

 1 mode:
2 type: Standalone
3 repository:
4 type: JDBC
5
6
7 dataSources:
8 ds_0:
9 dataSourceClassName: com.zaxxer.hikari.HikariDataSource
10 driverClassName: com.mysql.jdbc.Driver
11 jdbcUrl: jdbc:mysql://localhost:3306/ds0?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true
12 username: root
13 password: www.3power.CN
14 maxPoolSize: 10
15
16 rules:
17 - !SHARDING
18 tables:
19 t_order:
20 actualDataNodes: ds_0.t_order_vip,ds_0.t_order_normal
21 tableStrategy:
22 standard:
23 shardingColumn: user_id
24 # 下面的t_order_inline名称可以随意命名,但要于下的shardingAlgorithms中的名称一致
25 shardingAlgorithmName: t_order_inline
26 keyGenerateStrategy:
27 column: order_id
28 keyGeneratorName: snowflake_generator
29
30 shardingAlgorithms:
31 # 这里演示的是自定义分片算法
32 t_order_inline:
33 type: CLASS_BASED
34 props:
35 strategy: STANDARD
36 # 这里要填写完整的类名
37 algorithmClassName: shardingsphere.example.mybatis.custom.algorithm.CustomOrderIdAlgorithm
38
39 keyGenerators:
40 snowflake_generator:
41 type: SNOWFLAKE
42
43 props:
44 sql-show: true

对应4.x中的XML:

 1 <?xml version="1.0" encoding="UTF-8"?>
2
3 <beans xmlns="http://www.springframework.org/schema/beans"
4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 xmlns:context="http://www.springframework.org/schema/context"
6 xmlns:tx="http://www.springframework.org/schema/tx"
7 xmlns:sharding="http://shardingsphere.apache.org/schema/shardingsphere/sharding"
8 xmlns:bean="http://www.springframework.org/schema/util"
9 xsi:schemaLocation="http://www.springframework.org/schema/beans
10 http://www.springframework.org/schema/beans/spring-beans.xsd
11 http://www.springframework.org/schema/tx
12 http://www.springframework.org/schema/tx/spring-tx.xsd
13 http://www.springframework.org/schema/context
14 http://www.springframework.org/schema/context/spring-context.xsd
15 http://shardingsphere.apache.org/schema/shardingsphere/sharding
16 http://shardingsphere.apache.org/schema/shardingsphere/sharding/sharding.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
17 <context:component-scan base-package="shardingsphere.example.mybatis" />
18
19 <bean id="ds_0" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
20 <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
21 <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/ds0?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
22 <property name="username" value="root"/>
23 <property name="password" value="***"/>
24 </bean>
25
26 <bean:properties id="properties">
27 <prop key="worker.id">123</prop>
28 </bean:properties>
29
30 <sharding:key-generator id="orderKeyGenerator" type="SNOWFLAKE" column="order_id" props-ref="properties" />
31
32 <!--自定义分片算法-->
33 <sharding:standard-strategy id="userIdStrategy" sharding-column="user_id"
34 precise-algorithm-ref="customOrderIdAlgorithm"/>
35
36 <sharding:data-source id="shardingDataSource">
37 <sharding:sharding-rule data-source-names="ds_0" default-data-source-name="ds_0">
38 <sharding:table-rules>
39 <sharding:table-rule logic-table="t_order"
40 actual-data-nodes="ds_0.t_order_vip,ds_0.t_order_normal"
41 table-strategy-ref="userIdStrategy"
42 key-generator-ref="orderKeyGenerator" />
43
44 </sharding:table-rules>
45 </sharding:sharding-rule>
46 <sharding:props>
47 <prop key="sql.show">true</prop>
48 <prop key="max.connections.size.per.query">10</prop>
49 </sharding:props>
50 </sharding:data-source>
51
52 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
53 <property name="dataSource" ref="shardingDataSource" />
54 </bean>
55
56 <tx:annotation-driven />
57
58 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
59 <property name="dataSource" ref="shardingDataSource"/>
60 <property name="mapperLocations" value="classpath*:mappers/*.xml"/>
61 </bean>
62
63 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
64 <property name="basePackage" value="shardingsphere.example.mybatis.repository"/>
65 <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
66 </bean>
67 </beans>

二、自定义分片算法的写法不同

5.x中的写法,实现StandardShardingAlgorithm、ComplexKeysShardingAlgorithm、HintShardingAlgorithm中某1个即可

 1 package shardingsphere.example.mybatis.custom.algorithm;
2
3 import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
4 import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
5 import org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm;
6
7 import java.util.Collection;
8 import java.util.List;
9
10 public class CustomOrderIdAlgorithm implements StandardShardingAlgorithm<Integer> {
11
12 @Override
13 public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Integer> shardingValue) {
14 //演示自定义分片算法
15 //user_id是vip,在t_order_vip表中,否则在t_order_normal表中
16 String tableSuffix = "";
17 if (isVip(shardingValue.getValue())) {
18 tableSuffix = "_vip";
19 } else {
20 tableSuffix = "_normal";
21 }
22 for (String each : availableTargetNames) {
23 if (each.endsWith(tableSuffix)) {
24 return each;
25 }
26 }
27 return "";
28 }
29
30 boolean isVip(Integer userId) {
31 Integer value = userId % 10;
32 //user_id是1,2,3的视为vip(仅为演示)
33 List<Integer> vipUserIdList = List.of(1, 2, 3);
34 return vipUserIdList.contains(value);
35 }
36
37 @Override
38 public Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<Integer> shardingValue) {
39 throw new RuntimeException("not supported");
40 }
41 }

4.x中的写法,实现PreciseShardingAlgorithm

 1 package shardingsphere.example.mybatis.custom.algorithm;
2
3 import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
4 import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
5 import org.springframework.stereotype.Component;
6
7 import java.util.Collection;
8 import java.util.List;
9
10 @Component("customOrderIdAlgorithm")
11 public class CustomOrderIdAlgorithm implements PreciseShardingAlgorithm<Integer> {
12
13 @Override
14 public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Integer> shardingValue) {
15 //演示自定义分片算法
16 //user_id是vip,在t_order_vip表中,否则在t_order_normal表中
17 String tableSuffix = "";
18 if (isVip(shardingValue.getValue())) {
19 tableSuffix = "_vip";
20 } else {
21 tableSuffix = "_normal";
22 }
23 for (String each : availableTargetNames) {
24 if (each.endsWith(tableSuffix)) {
25 return each;
26 }
27 }
28 return "";
29 }
30
31 boolean isVip(Integer userId) {
32 Integer value = userId % 10;
33 //user_id是1,2,3的视为vip(仅为演示)
34 List<Integer> vipUserIdList = List.of(1, 2, 3);
35 return vipUserIdList.contains(value);
36 }
37 }

三、5.x 不再支持多个逻辑表(logic Table)对应同1个实际表(actual Table)

这个特性不再支持,我个人感觉是一种倒退。这个其实很有用,比如:如果只想查 VIP订单的数据(又不知道具体user_id),如果统一用逻辑表t_order来查询,会将所有分表全查一次,开销太大。在4.x中,可以这样处理(可参见:shading-jdbc 4.1.1 + tk.mybatis + pagehelper 1.3.x +spring boot 2.x 使用注意事项 - 菩提树下的杨过 - 博客园)

 1 <sharding:table-rule logic-table="t_order"
2 actual-data-nodes="ds_0.t_order_vip,ds_0.t_order_normal"
3 table-strategy-ref="userIdStrategy"
4 key-generator-ref="orderKeyGenerator" />
5
6 <!--查order_vip逻辑表,将直接路由到t_order_vip表-->
7 <sharding:table-rule logic-table="order_vip"
8 actual-data-nodes="ds_0.t_order_vip"
9 table-strategy-ref="userIdStrategy"
10 key-generator-ref="orderKeyGenerator" />
11
12 <!--查order_normal逻辑表,将直接路由到t_order_normal表-->
13 <sharding:table-rule logic-table="order_normal"
14 actual-data-nodes="ds_0.t_order_normal"
15 table-strategy-ref="userIdStrategy"
16 key-generator-ref="orderKeyGenerator" />
17 </sharding:table-rules>

但5.x中如果这样配置:

 1 rules:
2 - !SHARDING
3 tables:
4 t_order:
5 actualDataNodes: ds_0.t_order_vip,ds_0.t_order_normal
6 tableStrategy:
7 standard:
8 shardingColumn: user_id
9 shardingAlgorithmName: t_order_inline
10 keyGenerateStrategy:
11 column: order_id
12 keyGeneratorName: snowflake_generator
13
14 #order_vip映射到ds_0.t_order_vip(会报错)
15 order_vip:
16 actualDataNodes: ds_0.t_order_vip
17 tableStrategy:
18 standard:
19 shardingColumn: user_id
20 shardingAlgorithmName: t_order_inline
21 keyGenerateStrategy:
22 column: order_id
23 keyGeneratorName: snowflake_generator

运行时会报错:

Same actual data node cannot be configured in multiple logic tables in same database, logical table 'order_vip', actual data node 'ds_0.t_order_vip'.

github上也有人反馈这个:

Create sharding table rules with same data nodes will cause exception · Issue #33050 · apache/shardingsphere

5.5.2 Same actual data node cannot be configured in multiple logic tables in same database · Issue #34889 · apache/shardingsphere

示例代码:

github: yjmyzz/shardingsphere-mybatis-spring-namespace-example_4.1.1_5.5.2: shardingsphere mybatis 示例(4.1.1&5.5.2版本)

gitee: shardingsphere-mybatis-spring-namespace-example_4.1.1_5.5.2: shardingsphere + mybatis + spring 示例(从官网修改而来),适用4.1.1与5.5.2

shardingsphere从4.4.1升级至5.5.5注意事项的更多相关文章

  1. mysql5.x升级至mysql5.7后导入之前数据库date出错的解决方法!

    mysql5.x升级至mysql5.7后导入之前数据库date出错的解决方法! 修改mysql5.7的配置文件即可解决,方法如下: linux版:找到mysql的安装路径进入默认的为/usr/shar ...

  2. .NET跨平台之旅:将示例站点从 ASP.NET 5 RC1 升级至 ASP.NET Core 1.0

    终于将“.NET跨平台之旅”的示例站点 about.cnblogs.com 从 ASP.NET 5 RC1 升级至 ASP.NET Core 1.0 ,经历了不少周折,在这篇博文中记录一下. 从 AS ...

  3. .NET跨平台之旅:将示例站点从ASP.NET 5 Beta7升级至RC1

    今天,我们将示例站点(about.cnblogs.com,服务器操作系统是Ubuntu)从ASP.NET 5 Beta7升级到了RC1,在升级过程中只遇到了一个问题. 在运行 dnvm upgrade ...

  4. .NET跨平台之旅:将示例站点从ASP.NET 5 Beta5升级至Beta7

    9月2日,微软发布了ASP.NET 5 Beta7(详见Announcing Availability of ASP.NET 5 Beta7).其中最大的亮点是dnx已经可以完全基于CoreCLR运行 ...

  5. 将EnyimMemcached从.NET Core RC1升级至RC2

    .NET Core RC1时project.json中的配置如下: { "version": "3.2.4", "summary": &qu ...

  6. Windows 8.1升级至Windows 10后,启动VisualSVN Server Manager报错:提供程序无法执行所尝试的操作 (0x80041024)的解决

    1.1.Windows 8.1升级至Windows 10后,启动VisualSVN Server Manager报错:提供程序无法执行所尝试的操作 (0x80041024),VisualSVN Ser ...

  7. CentOS 6.8内核版本升级(升级至3.10)(转)

    1.查看当前版本 [root@www.linuxidc.com docker]# cat /etc/issue CentOS release 6.8 (Final) Kernel \r on an \ ...

  8. Botposter.com集群ETCD2.3.7升级至3.0实录[原创]

    7月1日,为庆祝我党生日,ETCD隆重发布了3.0版本.Botposter.com也在第一时间对集群进行了升级.本文是升级过程的记录与总结(文中假设读者已经使用或测试过ETCD V2,如有不妥请见谅) ...

  9. Struts2从版本2.2.1升级至2.3.15.1出现的问题

    问题一 原版本Struts2.2.1中的JSP代码如下: <a class="buttonSelect" href="/manage/machine/uploadF ...

  10. NodeJS 框架 Express 从 3.0升级至4.0的新特性

    NodeJS 框架 Express 从 3.0升级至4.0的新特性 [原文地址:√https://scotch.io/bar-talk/expressjs-4-0-new-features-and-u ...

随机推荐

  1. 服务器时间漂移,如何开启Linux NTP自动同步

    前言 在日常服务器运维中,我们往往默认服务器的时间是精准的.但最近一次偶然的 date 查询,让我发现--服务器时间竟然悄悄地漂移了-- 本文记录了整个排查与解决的过程,希望能帮到遇到类似问题的朋友, ...

  2. 炸裂!!!Deepseek接入个人知识库,回答速度飞起来,确实可以封神了

    高效管理知识.快速获取信息成为提升工作效率的关键.无论是做技术的同学还是普通的上班族,在日常积累了大量的知识数据和内容.项目文档.会议记录到技术手册.业务流程,这些信息如同宝藏一般,等待着被高效利用. ...

  3. rider更新2021.2

    Rider 的新功能Rider 2021.2 带有增强的 C# 语言支持,包括对代码分析.可为空引用类型和源生成器的大量更新.对于 Web 开发人员,此版本支持 ASP.NET Core Endpoi ...

  4. 关于navicat导出和导入sql文件的方法

    导出SQL文件 导入SQL文件 导出技巧 导出SQL文件 到处数据库的方法很简单,只需要在要到处的数据库上面右键,选择转储SQL文件,可以选结构和数据...或者结构... 导入SQL文件 导如SQL文 ...

  5. 【笔记】PyVis|神经网络数据集的可视化

    文章目录 版本: 应用实例: PyVis的应用: 零.官方教程 一.初始化画布`Network` 二.添加结点 添加单个结点`add_node`: 添加一系列结点`add_nodes`: 三.添加边 ...

  6. 【UEFI】PEI阶段从概念到代码

    总述 UEFI开发过程中,BIOS工程师主要关注点和工作都在于PEI和DXE阶段. DXE阶段是我们的主战场,可以进行丰富且大量的功能驱动开发. 实际上,在UEFI Spec中,就指出 ---- Th ...

  7. EBC Rev.5中的中间品、消费品,资本品,HS2012,HS2017与EBC Rev.5对照表,各种贸易标准对照表....

    最近在做一个国际供应链问题研究,用到了中间品这个概念,在各大论坛逛了好久居然没有找到一个说清楚了的,某些论坛需要什么点数才能下载,论坛用户更是自视甚高,一副这也不懂的姿态审视所有刚入门这个领域的新人, ...

  8. MySQL高可用之PXC

    1.PXC简介 参考Percona官方https://www.percona.com/software/mysql-database/percona-xtradb-cluster   PXC(Perc ...

  9. cf记录

    cf2107D \(Question:\)给定一个节点为\(n(1 \leq n \leq 2e5)\)的树,定义三元组\((d,u,v)\)为从点\(u\)到点\(v\)的路径长度\(d\),每次选 ...

  10. 全网第二细致的Verl GRPO实现拆解讲解

    全网第二细致的Verl GRPO实现拆解讲解 标题党致歉,纯引流 观前提示,内含大量注释代码,善用左侧目录跳过可改善阅读体验 本篇文章是在锝人的报告下继续撰写,主要着重于讲解verl实现中一些GRPO ...