shardingsphere读写分离+分表

用到的框架:mybatis-plus、druid、shardingsphere-jdbc-spring-boot-starter

  1. 依赖(gradle配置,maven对应去mvnrepository查询)
    implementation 'com.alibaba:druid:1.2.8'implementation('com.baomidou:mybatis-plus-boot-starter:3.4.3')implementation 'org.postgresql:postgresql:42.3.3'implementation 'org.apache.shardingsphere:sharding-jdbc-spring-boot-starter:4.1.1'implementation 'org.apache.shardingsphere:sharding-jdbc-spring-namespace:4.1.1'
  1. yml配置
spring:shardingsphere:# 是否打印sqlprops:sql.show: truedatasource:# 库1 的配置db1:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: org.postgresql.Driverurl: jdbc:postgresql://localhost:5432/dd_testusername: postgrespassword: 123456# 库2 的配置db1-slave0:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: org.postgresql.Driverurl: jdbc:postgresql://localhost:5433/dd_testusername: postgrespassword: 123456names: db1,db1-slave0sharding:# 默认的库default-data-source-name: db1# 绑定的表 不配置也没找出啥问题binding-tables: dd_order,order_skudefault-table-strategy:none:default-database-strategy:none:# 配置表的分片规则tables:# 指定某个表的分片配置dd_order:# 这个配置是告诉sharding有多少个库和多少个表actual-data-nodes: ms.dd_order_$->{1..7}#分库策略database-strategy:none:# 行表达式#            inline:#              # 配置表分片的字段#              sharding-column: ship_id#              # 配置表分片算法#              algorithm-expression: dd_order_$->{ship_id % 7 +1}# 主键生成策略(如果是自动生成的,在插入数据的sql中就不要传id,null也不行,直接插入字段中就不要有主键的字段)key-generator:# 对应的数据库表的主键column: id# 生成方式, 雪花模式type: SNOWFLAKE# 配置表分片策略table-strategy:standard:sharding-column: idprecise-algorithm-class-name: cn.venny.shardingsphere.CustomShardingPreciseAlgorithmrange-algorithm-class-name: cn.venny.shardingsphere.CustomShardingRangeAlgorithm# 指定某个表的分片配置order_sku:# 这个配置是告诉sharding有多少个库和多少个表actual-data-nodes: ms.order_sku_$->{1..9}#分库策略database-strategy:none:# 主键生成策略(如果是自动生成的,在插入数据的sql中就不要传id,null也不行,直接插入字段中就不要有主键的字段)key-generator:# 对应的数据库表的主键column: id# 生成方式, 雪花模式type: SNOWFLAKE# 配置表分片策略table-strategy:standard:sharding-column: idprecise-algorithm-class-name: cn.venny.shardingsphere.CustomShardingPreciseAlgorithmrange-algorithm-class-name: cn.venny.shardingsphere.CustomShardingRangeAlgorithmmasterSlaveRules:ms:name: msmaster-data-source-name: db1slave-data-source-names: db1-slave0load-balance-algorithm-type: ROUND_ROBIN
  1. 2个算法代码:
  • 用到的工具类
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @author Vick C* @version 1.0* @date 2022/3/8 22:56*/
public class PatternUtils {private static final Pattern SHARDING_TABLE_RULE = Pattern.compile("\\d");public static String parseNum(String string) {if (string == null || string.length() < 1) {return null;}Matcher matcher = SHARDING_TABLE_RULE.matcher(string);StringBuilder sb = new StringBuilder();while (matcher.find()) {sb.append(matcher.group());}return sb.toString();}
}
  • 第一个算法
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;import java.util.Collection;/*** @author Vick C* @version 1.0* @date 2022/3/8 22:52*/
public class CustomShardingPreciseAlgorithm implements PreciseShardingAlgorithm<String> {/** dd_order分7张表 */private static final int ORDER_TABLE_NUM = 7;/** order_sku分9张表 */private static final int ORDER_SKU_TABLE_NUM = 9;@Overridepublic String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<String> shardingValue) {String columnName = shardingValue.getColumnName();if (!"id".equals(columnName)) {return null;}// 自定义正则表达式String s = PatternUtils.parseNum(shardingValue.getValue());// 工具类用spring即可if (StringUtils.isEmpty(s)) {return null;}long num = Long.parseLong(s);long remain = 1;if (shardingValue.getLogicTableName().contains("order_sku")) {remain = num % ORDER_SKU_TABLE_NUM + 1;} else {remain = num % ORDER_TABLE_NUM + 1;}for (String availableTargetName : availableTargetNames) {if (availableTargetName.endsWith(String.valueOf(remain))) {return availableTargetName;}}return null;}
}
  • 第二个算法

import com.google.common.collect.Range;
import org.apache.shardingsphere.api.sharding.standard.RangeShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.RangeShardingValue;import java.util.Collection;
import java.util.List;/*** @author Vick C* @version 1.0* @date 2022/3/8 22:59*/
public class CustomShardingRangeAlgorithm implements RangeShardingAlgorithm<String> {/** dd_order分7张表 */private static final int ORDER_TABLE_NUM = 7;/** order_sku分9张表 */private static final int ORDER_SKU_TABLE_NUM = 9;@Overridepublic Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<String> shardingValue) {String columnName = shardingValue.getColumnName();if ("id".equals(columnName)) {Range<String> valueRange = shardingValue.getValueRange();String logicTableName = shardingValue.getLogicTableName();String lowerTable = calcTableValue(logicTableName, valueRange.lowerEndpoint(), availableTargetNames);String upperTable = calcTableValue(logicTableName, valueRange.upperEndpoint(), availableTargetNames);if (lowerTable != null && upperTable != null) {List<String> list = CollectionUtils.singleList(lowerTable);list.add(upperTable);return list;}}return null;}private String calcTableValue(String logicTableName, String lowerEndpoint, Collection<String> availableTargetNames) {String s = PatternUtils.parseNum(lowerEndpoint);if (StringUtils.notEmpty(s)) {long num = Long.parseLong(s);long remain = 1;if (logicTableName.contains("order_sku")) {remain = num % ORDER_SKU_TABLE_NUM + 1;} else {remain = num % ORDER_TABLE_NUM + 1;}for (String availableTargetName : availableTargetNames) {if (availableTargetName.endsWith(String.valueOf(remain))) {return availableTargetName;}}}return null;}
}
  1. 数据库建表
    略…注意shardingsphere不会自动建表,所有的表都要手动建
  2. 测试(略…)

pg使用insert into … on conflict (字段名) do update set …成功插入不同表
使用mybaits save()方法一样可以插入不同表

shardingsphere读写分离+分表【笔记】相关推荐

  1. 视频教程-ShardingSphere:SpringBoot2+MybatisPlus读写分离+分表-Java

    ShardingSphere:SpringBoot2+MybatisPlus读写分离+分表 10多年互联网一线实战经验,现就职于大型知名互联网企业,架构师, 有丰富实战经验和企业面试经验:曾就职于某上 ...

  2. Shardingsphere的分库分表+读写分离+分页条件查询

    Shardingsphere的分库分表与读写分离 导入依赖 <dependencies><dependency><groupId>org.springframewo ...

  3. ShardingSphere读写分离

    读写分离是为了确保数据库产品的稳定性,很多数据库拥有双机热备功能. 原理:让主数据库(master)处理事务性增.改.删操作,而从数据库(slave)处理select查询操作. 注意: Shardin ...

  4. ShardingSphere JDBC 分库分表 读写分离 数据加密

    简介 在上篇文章中,在本地搭建了运行环境,本地来体验下ShardingSphere JDBC的三个功能:分库分表.读写分离.数据加密 示例运行 首先把概念先捋一捋,参考下面的文档: 数据分片 读写分离 ...

  5. Sharding-Proxy读写分离_Sharding-Sphere_分库分表_读写分离_工作笔记021

    然后我们再去看,我们用sharding-proxy,实现读写分离. 我们可以参考sharding-shpere的官网去查看,可以参考对应的配置,来配置主从数据库,配置读写分离 首先我们要去配置读写分离 ...

  6. ShardingSphere简介与分表使用

    一.ShardingSphere简介 1.简介 ShardingSphere 已于 2020 年 4 月 16 日成为 Apache 软件基金会的顶级项目. ShardingSphere 是一套开源的 ...

  7. “数据中台、读写分离、表分区”解决MySQL 单表数据量、并放量双高的效率瓶颈

    需求情景:现有一数据库表,用于记录每一台设备的各种指标项数据,每台设备指标项约150个左右,共有10台设备(后期还会增加),每台设备每2秒写入1次数据,即:数据库单表每秒写入数据量=10台设备*150 ...

  8. Springboot2.x +JPA 集成 Apache ShardingSphere 读写分离

    分库分表背景: 数据库性能瓶颈:主要分为按照业务来划分或者按照数据量来划分. 拆分方式: 水平拆分(每个表的结构都一样):订单表数据量大,我们可以水平拆分 ,分成order表1.order表2.ord ...

  9. Springboot2.x +JPA 集成 Apache ShardingSphere 同库分表

    分库分表背景: 数据库性能瓶颈:主要分为按照业务来划分或者按照数据量来划分. 拆分方式: 水平拆分(每个表的结构都一样):订单表数据量大,我们可以水平拆分 ,分成order表1.order表2.ord ...

最新文章

  1. iOS 9应用开发教程之ios9中实现按钮的响应
  2. .Net中堆栈和堆的区别
  3. mysql中non用什么_mysql Non-Transactional Database Only(只支持MyISAM)
  4. Asp.net core与golang web简单对比测试
  5. activemq 性能测试_ActiveMQ性能测试
  6. 数学建模 割平面算法求解整数规划基本原理与编程实现
  7. 怎样用CDN防篡改、抗攻击、控内容?一份CDN安全指南请查收
  8. python解释器用什么写的_用 Python 从零开始写一个简单的解释器(3)
  9. 大疆aeb连拍_大疆 AIR2 玩机(一)包围曝光及后期处理
  10. nginx发布静态目录备忘
  11. 鸿蒙官网首页,鸿蒙官网-鸿蒙手游官网首页最新版预约 v1.0-优盘手机站
  12. Web安全—Web漏扫工具NetSparker安装与使用
  13. Android SDK环境变量配置-Windows10
  14. xml大于等于转移_Mybatis.xml文件中大于小于等于
  15. 王道408思维导图 marginnote 【4门科齐全】Xmind+脑图原件可下载 - 在线分享
  16. C# 判断有向图是否存在环
  17. PE格式的定义头文件winnt.h
  18. 一笔画 java_NYOJ42 一笔画问题
  19. TCP Socket与TCP 连接
  20. 纽约州立大学环境与林业学院计算机科学专业,纽约州立大学环境与林业学院研究生专业 如何应对严峻的环境污染问题...

热门文章

  1. 程序员追求技术夯实基础学习路线建议
  2. 数字电路——与或非逻辑门电路
  3. 桌面图标文件不能拖动的解决方法
  4. php 警告提示框,js弹出对话框(消息框、警告框)
  5. 为什么要用CAT工具辅助翻译?为什么要用翻译管理系统?以memoQ为例
  6. TCP Data Flow and Window Management(1)
  7. git clone出现 fatal: unable to access ‘https://github.com/...‘的解决办法(亲测有效)
  8. 【JMeter】JMeter怎么实现接口关联?
  9. js中如何将字符串转化为时间,并计算时间差
  10. JSP, Servlet常见面试题详解