shardingsphere读写分离+分表【笔记】
shardingsphere读写分离+分表
用到的框架:mybatis-plus、druid、shardingsphere-jdbc-spring-boot-starter
- 依赖(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'
- 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
- 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;}
}
- 数据库建表
略…注意shardingsphere不会自动建表,所有的表都要手动建
- 测试(略…)
pg使用insert into … on conflict (字段名) do update set …成功插入不同表
使用mybaits save()方法一样可以插入不同表
shardingsphere读写分离+分表【笔记】相关推荐
- 视频教程-ShardingSphere:SpringBoot2+MybatisPlus读写分离+分表-Java
ShardingSphere:SpringBoot2+MybatisPlus读写分离+分表 10多年互联网一线实战经验,现就职于大型知名互联网企业,架构师, 有丰富实战经验和企业面试经验:曾就职于某上 ...
- Shardingsphere的分库分表+读写分离+分页条件查询
Shardingsphere的分库分表与读写分离 导入依赖 <dependencies><dependency><groupId>org.springframewo ...
- ShardingSphere读写分离
读写分离是为了确保数据库产品的稳定性,很多数据库拥有双机热备功能. 原理:让主数据库(master)处理事务性增.改.删操作,而从数据库(slave)处理select查询操作. 注意: Shardin ...
- ShardingSphere JDBC 分库分表 读写分离 数据加密
简介 在上篇文章中,在本地搭建了运行环境,本地来体验下ShardingSphere JDBC的三个功能:分库分表.读写分离.数据加密 示例运行 首先把概念先捋一捋,参考下面的文档: 数据分片 读写分离 ...
- Sharding-Proxy读写分离_Sharding-Sphere_分库分表_读写分离_工作笔记021
然后我们再去看,我们用sharding-proxy,实现读写分离. 我们可以参考sharding-shpere的官网去查看,可以参考对应的配置,来配置主从数据库,配置读写分离 首先我们要去配置读写分离 ...
- ShardingSphere简介与分表使用
一.ShardingSphere简介 1.简介 ShardingSphere 已于 2020 年 4 月 16 日成为 Apache 软件基金会的顶级项目. ShardingSphere 是一套开源的 ...
- “数据中台、读写分离、表分区”解决MySQL 单表数据量、并放量双高的效率瓶颈
需求情景:现有一数据库表,用于记录每一台设备的各种指标项数据,每台设备指标项约150个左右,共有10台设备(后期还会增加),每台设备每2秒写入1次数据,即:数据库单表每秒写入数据量=10台设备*150 ...
- Springboot2.x +JPA 集成 Apache ShardingSphere 读写分离
分库分表背景: 数据库性能瓶颈:主要分为按照业务来划分或者按照数据量来划分. 拆分方式: 水平拆分(每个表的结构都一样):订单表数据量大,我们可以水平拆分 ,分成order表1.order表2.ord ...
- Springboot2.x +JPA 集成 Apache ShardingSphere 同库分表
分库分表背景: 数据库性能瓶颈:主要分为按照业务来划分或者按照数据量来划分. 拆分方式: 水平拆分(每个表的结构都一样):订单表数据量大,我们可以水平拆分 ,分成order表1.order表2.ord ...
最新文章
- iOS 9应用开发教程之ios9中实现按钮的响应
- .Net中堆栈和堆的区别
- mysql中non用什么_mysql Non-Transactional Database Only(只支持MyISAM)
- Asp.net core与golang web简单对比测试
- activemq 性能测试_ActiveMQ性能测试
- 数学建模 割平面算法求解整数规划基本原理与编程实现
- 怎样用CDN防篡改、抗攻击、控内容?一份CDN安全指南请查收
- python解释器用什么写的_用 Python 从零开始写一个简单的解释器(3)
- 大疆aeb连拍_大疆 AIR2 玩机(一)包围曝光及后期处理
- nginx发布静态目录备忘
- 鸿蒙官网首页,鸿蒙官网-鸿蒙手游官网首页最新版预约 v1.0-优盘手机站
- Web安全—Web漏扫工具NetSparker安装与使用
- Android SDK环境变量配置-Windows10
- xml大于等于转移_Mybatis.xml文件中大于小于等于
- 王道408思维导图 marginnote 【4门科齐全】Xmind+脑图原件可下载 - 在线分享
- C# 判断有向图是否存在环
- PE格式的定义头文件winnt.h
- 一笔画 java_NYOJ42 一笔画问题
- TCP Socket与TCP 连接
- 纽约州立大学环境与林业学院计算机科学专业,纽约州立大学环境与林业学院研究生专业 如何应对严峻的环境污染问题...
热门文章
- 程序员追求技术夯实基础学习路线建议
- 数字电路——与或非逻辑门电路
- 桌面图标文件不能拖动的解决方法
- php 警告提示框,js弹出对话框(消息框、警告框)
- 为什么要用CAT工具辅助翻译?为什么要用翻译管理系统?以memoQ为例
- TCP Data Flow and Window Management(1)
- git clone出现 fatal: unable to access ‘https://github.com/...‘的解决办法(亲测有效)
- 【JMeter】JMeter怎么实现接口关联?
- js中如何将字符串转化为时间,并计算时间差
- JSP, Servlet常见面试题详解