公司有个记录表,每天有几百万的数据,所以我决定按月把他分下表。

用spring整合的。

首先,sharding-sphere不支持自动创建表,所以我提前创建了两年的表,命名规则 logicTableName + _2019_06

以下是官方文档上面的分片算法介绍:

由于这个记录表在业务层面,只有insert 和 query ,我就用create_datetime作为分表位,查询是有时间范围的,所以我选择复合分片算法。

以下是代码。

package com.beisheng.sharding;import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;import com.google.common.collect.Lists;
import com.google.common.collect.Range;
import com.xhlc.pay.util.DatetimeUtil;import io.shardingsphere.api.algorithm.sharding.ListShardingValue;
import io.shardingsphere.api.algorithm.sharding.PreciseShardingValue;
import io.shardingsphere.api.algorithm.sharding.RangeShardingValue;
import io.shardingsphere.api.algorithm.sharding.ShardingValue;
import io.shardingsphere.api.algorithm.sharding.complex.ComplexKeysShardingAlgorithm;
import lombok.extern.slf4j.Slf4j;
/*** * @author OliverAAAAA* @since  2019-6-10 12:00:00**/
@Service("tShopUploadAppInfoRecordTableShardingAlgorithm")
@Slf4j
public class TShopUploadAppInfoRecordTableShardingAlgorithm implements ComplexKeysShardingAlgorithm {@SuppressWarnings("unchecked")@Overridepublic Collection<String> doSharding(Collection<String> availableTargetNames, Collection<ShardingValue> shardingValues) {Collection<String> routTables = new HashSet<String>();if (shardingValues != null) {for (ShardingValue shardingValue : shardingValues) {// eq 条件if (shardingValue instanceof PreciseShardingValue) {PreciseShardingValue<Date> preciseShardingValue = (PreciseShardingValue<Date>) shardingValue;Date value = preciseShardingValue.getValue();String routTable = getRoutTable(preciseShardingValue.getLogicTableName(), value);if (StringUtils.isNotBlank(routTable)) {routTables.add(routTable);}// between 条件} else if (shardingValue instanceof RangeShardingValue) {RangeShardingValue<Date> rangeShardingValue = (RangeShardingValue<Date>) shardingValue;Range<Date> valueRange = rangeShardingValue.getValueRange();Date lowerEnd = (Date) valueRange.lowerEndpoint();Date upperEnd = (Date) valueRange.upperEndpoint();Collection<String> tables = getRoutTable(shardingValue.getLogicTableName(), lowerEnd, upperEnd);if (tables != null && tables.size() > 0) {routTables.addAll(tables);}//多个参数} else if (shardingValue instanceof ListShardingValue) {ListShardingValue<Date> rangeShardingValue = (ListShardingValue<Date>) shardingValue;Collection<Date> values = rangeShardingValue.getValues();for (Date date : values) {String routTable = getRoutTable(shardingValue.getLogicTableName(), date);if (StringUtils.isNotBlank(routTable)) {routTables.add(routTable);}}}if (routTables != null && routTables.size() > 0) {return routTables;}}}throw new UnsupportedOperationException();}private String getRoutTable(String logicTable, Date keyValue) {if (keyValue != null) {String formatDate = DatetimeUtil.formatDate(keyValue, "_YYYY_MM");return logicTable + formatDate;}return null;}public static void main(String[] args) {Calendar cal = Calendar.getInstance();Date start = cal.getTime();String formatDate = DatetimeUtil.formatDate(start, "_YYYY_MM");cal.set(Calendar.MONTH, 10);Date end = cal.getTime();List<String> list = getRangeNameList(start, end);System.out.println(list);System.out.println(formatDate);}private static List<String> getRangeNameList(Date start, Date end) {List<String> result = Lists.newArrayList();Calendar dd = Calendar.getInstance();// 定义日期实例dd.setTime(start);// 设置日期起始时间while (dd.getTime().before(end)) {// 判断是否到结束日期SimpleDateFormat sdf = new SimpleDateFormat("_YYYY_MM");String str = sdf.format(dd.getTime());result.add(str);dd.add(Calendar.MONTH, 1);// 进行当前日期月份加1}return result;}private Collection<String> getRoutTable(String logicTable, Date lowerEnd, Date upperEnd) {Set<String> routTables = new HashSet<String>();if (lowerEnd != null && upperEnd != null) {List<String> rangeNameList = getRangeNameList(lowerEnd, upperEnd);for (String string : rangeNameList) {routTables.add(logicTable + string);}}return routTables;}}

下面是配置:

<bean id="tShopUploadAppInfoRecordTableShardingAlgorithm" class="com.beisheng.sharding.TShopUploadAppInfoRecordTableShardingAlgorithm" /><sharding:complex-strategy id="strategyTableTShopUploadAppInfoRecord" sharding-columns="create_datetime" algorithm-ref="tShopUploadAppInfoRecordTableShardingAlgorithm"  /><sharding:data-source id="dynamicDataSource"><sharding:sharding-rule data-source-names="ds_cdf_master_0,ds_cdf_slave_0"default-data-source-name="ds_cdf_master_0"><sharding:master-slave-rules><sharding:master-slave-rule id="ds_ms0"master-data-source-name="ds_cdf_master_0" slave-data-source-names="ds_cdf_slave_0"strategy-type="RANDOM" /></sharding:master-slave-rules><sharding:table-rules><sharding:table-rule logic-table="t_shop_upload_app_info_record"table-strategy-ref="strategyTableTShopUploadAppInfoRecord" /></sharding:table-rules><sharding:binding-table-rules><sharding:binding-table-rulelogic-tables="t_shop_upload_app_info_record" /></sharding:binding-table-rules></sharding:sharding-rule><sharding:props><prop key="sql.show">${shard.sql.show}</prop></sharding:props></sharding:data-source>

纯原创,转载请注明出处~

本人最近开了一个公众号,会讲一些常用的技术,以及面试题,欢迎关注

扫码关注,每天获取最前沿的互联网知识~

sharding-sphere按月动态分表相关推荐

  1. sharding-jdbc系列之按月动态分表(十二)

    后续文章首发在个人博客,欢迎移驾我的个人博客浏览该文章 https://shared-code.com/article/79 欢迎关注公众号 回复 "分库分表" 获取分库分表dem ...

  2. shardingjdbc全局表_Sharding-JDBC动态分表实现

    Sharding-JDBC动态水平分表实现 背景: 在项目中遇到了按照日期动态水平分表的需求,系统属于监控系统,每10分钟保存一次监控数据,并且每次要采集200个节点上的数据,即每次采集数据(间隔10 ...

  3. java jdbc 表存在_使用JDBC查询是否存在某表或视图,按月动态生成表

    查询数据库是否有某表的存在,主要用的就是Connection对象对元数据的操作,代码很简单,贴出来大家参考. /** * 查询数据库是否有某表 * @param cnn * @param tableN ...

  4. maysql 按月建立分表

    Mysql 建立水平分表 项目需求,按月建立水平分表 目录 Mysql 建立水平分表 前言 一.使用工具 二.创建分表过程 1. 创建需要的主表 2.建立创建分表函数 ​ 3.创建建立分表事件(定时器 ...

  5. mysql sharding 知乎_分库分表系列(1)-shardingsphere核心概念

    欢迎关注公众号: 戏说码农职场 咱们不闲扯, 就直接入正题, 这次总结说下sharding-jdbc 分库分表的工具.整体架构 Apache ShardingSphere 是一套开源的分布式数据库中间 ...

  6. mysql判断视图是否存在_使用JDBC查询是否存在某表或视图,按月动态生成表

    查询数据库是否有某表的存在,主要用的就是Connection对象对元数据的操作,代码很简单,贴出来大家参考 /** * 查询数据库是否有某表 * @param cnn * @param tableNa ...

  7. sharding jdbc:分库、分表;读写分离;

    1 转载于:https://www.cnblogs.com/cnki/p/8835764.html

  8. Sharding动态按月分表

    有功能需要用到按月分表,大体记录一下,只是简单测试了一下,可能会有问题...... springboot+mybatis+sharding,要是用分页的部分是单独配置的数据源,不想让主要业务也走sha ...

  9. efcore根据多个条件更新_EFCore.Sharding(EFCore开源分表框架)

    简介 本框架旨在为EF Core提供Sharding(即读写分离分库分表)支持,不仅提供了一套强大的普通数据操作接口,并且降低了分表难度,支持按时间自动分表扩容,提供的操作接口简洁统一. 源码地址:E ...

最新文章

  1. java c++的区别_Java语言与C、C++之间的区别?
  2. 赢得高薪的锦囊三秘诀
  3. java基础面试题:说说和的区别
  4. selenium.common.exceptions.WebDriverException: Message: ‘chromedriver’解决
  5. 全国高速恢复收费!阿里云:自由流“3大特色能力”使能智慧之路
  6. 操作系统之计算机系统概述:5、中断和异常
  7. 使用SQLSERVER的扩展存储过程实现远程备份与恢复
  8. 走进R语言的世界——简单数据处理
  9. 超越LLMNR /NBNS欺骗 - 利用Active Directory集成的DNS
  10. BZOJ1059 [ZJOI2007]矩阵游戏
  11. 中国移动--九天毕昇平台使用测试(薅Telsa V100)
  12. 如何书写一手优雅的代码之小刚有话说
  13. 读书《你能写出好故事:写作的诀窍、大脑的奥秘、认知的陷阱》
  14. php实现的证件照换底色功能示例【人像抠图/换背景图】
  15. python pip 安装失败问题解决
  16. Mac 终端的入门指南与进阶技巧
  17. Win10下安装Spark的尝试总结(尚未出坑)
  18. 企业员工信息管理系统源码+ppt+论文+中期检查表+sql
  19. 三相两相坐标变换matlab仿真,交流电机三相两相坐标互换及MATLAB仿真.pdf
  20. jmeter入门使用

热门文章

  1. [html] 如何在页面上显示Emoji表情?
  2. [html] a标签的默认事件禁用后,如何实现跳转?
  3. PS教程第二十四课:魔法棒
  4. [html] 为什么说cookie不可以滥用?
  5. [css] 假如css的分号写在声明块之外,将会发生什么呢?解释下原因
  6. 前端学习(2756):condition模拟启动配置
  7. 工作177:时间戳转换
  8. “约见”面试官系列之常见面试题之第六十二篇之IE和兼容下写法(建议收藏)
  9. 前端学习(1439):vue的helloworld
  10. 前端学习(534):多列布局1