sharding-sphere按月动态分表

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

用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>

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

 

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/413539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大厂Java岗面试心得记录

最近裸辞&#xff0c;面了几家大厂&#xff0c;offer率高达100% 哈哈&#xff0c;然后发现选公司也是一件难事。 废话不多说&#xff0c;分享一下&#xff0c;我遇到的面试题&#xff0c;大概有以下这些&#xff1a; JVM: 1.JVM有哪些区域&#xff1f; 2.堆和栈分别说说内部东…

原生Js 两种方法实现页面关键字高亮显示

方法一 依靠正则表达式修改 1.获取obj的html 2.统一替换html标签 3.替换要修改的关键字 4.再把html标签修改回去 不足就是如果查找的关键字跟替换的标签一样就有冲突了 <!DOCTYPE HTML> <html lang"en"> <meta http-equiv"Content-Type" co…

SpringBoot启动报错java.nio.charset.MalformedInputException: Input length = 2解决方案

最近新搭的一个项目&#xff0c;启动时&#xff0c;会报MalformedInputException这个异常&#xff0c; 百度了很久&#xff0c;网上说的千篇一律&#xff0c; 有的说&#xff0c;把yml复制到txt再复制回来 有的说&#xff0c;设置eclipse的utf-8环境 这些根本没有根治这个问…

IDEA主题设置与eclipse代码风格一致

习惯了用eclipse的你&#xff0c;是不是转到用idea特别不习惯&#xff0c;没有关系&#xff0c; 我们可以把idea的代码风格改成eclipse的&#xff0c;快捷键也换成eclipse的。 下载这个jar包&#xff0c;导入settings文件即可 下载地址 : https://download.csdn.net/download…

浅谈分布式锁

概述 为了防止分布式系统中的多个进程之间相互干扰&#xff0c;我们需要一种分布式协调技术来对这些进程进行调度。而这个分布式协调技术的核心就是来实现这个分布式锁。 为什么要使用分布式锁 成员变量 A 存在 JVM1、JVM2、JVM3 三个 JVM 内存中 成员变量 A 同时都会在 JVM …

[css] 说说sroll-snap-type属性的运用场景有哪些?相关联的属性还有哪些?

[css] 说说sroll-snap-type属性的运用场景有哪些&#xff1f;相关联的属性还有哪些&#xff1f; 使用 sroll-snap-type 优化滚动 根据 CSS Scroll Snap Module Level 1 规范&#xff0c;CSS 新增了一批能够控制滚动的属性&#xff0c;让滚动能够在仅仅通过 CSS 的控制下&#…

简单的一个月之设计实现内容1

需求:简单的新闻管理系统,实现简单的增删改查功能 1.数据库表的建立 ID非空,数据类型看着给 2.写实体(entity)News.java 要与数据库中的字段相对应,(id,optimistic我没写,问题不大)1 package com.pay.boss.entity; //封装好的entity包,直接引用2 3 import java.util.Date; …

分享一个有趣的网站“让我帮你百度一下“

如何解决同事的弱智问题&#xff0c;分享一个有趣的网站 日常工作中&#xff0c;总有些人会问你一些弱智的问题 你只需要三步就可以完美解决: 1.打开这个链接: 让我帮你百度一下 2.输入他的问题、点回车 3.复制结果链接甩到他的脸上_ hahahhahahaha 这样就解决了一切烦恼&a…

SQL Server2014 SP2新增的数据库克隆功能

SQL Server2014 SP2新增的数据库克隆功能 原文:SQL Server2014 SP2新增的数据库克隆功能SQL Server2014 SP2新增的数据库克隆功能 创建测试库 --创建测试数据库 create database testtestuse testtest go --创建表 create table testtest(id int ,name varchar(20)) --插入数据…

工作328:uni-两个页面对象传递

getDetailList(record){console.log(record)uni.navigateTo({url:../formdaliyList/formdaliyList?recordencodeURIComponent(JSON.stringify(record))})},onLoad(e){/* JSON.parse() */let obj JSON.parse(decodeURIComponent(e.record));console.log(obj)},

vue-js 特殊变量$event常识

背景 如果我们要阻止默认事件&#xff0c;在 chrome 等浏览器中&#xff0c;我们可能要写一个&#xff1a; event.preventDefault(); 而在 IE 中&#xff0c;我们则需要写&#xff1a; event.returnValue false; jquery &#xff0c;跨浏览器的实现&#xff0c;我们统一只…

七、线性表的链式存储结构

1、问题引入 开发数组类模板的原因在于&#xff1a;在创建基于顺序存储结构的线性表时&#xff0c;发现这样的线性表可能被误用&#xff0c;因为重载了数组访问操作符&#xff0c;使用时跟数组类似&#xff0c;但是线性表和数组有很大的区别&#xff0c;所以激发了新的需求&…

工作333:uni-增加添加成功提示

this.$u.api.getPartyAdd(this.form).then(res > {console.log(res)if(res.data.code200){/* uni.showLoading({title: 添加中}); */this.$refs.uToast.show({title: res.data.message,type: success,})setTimeout(function () {uni.navigateTo({url: "../notice_notic…

HDU 6064 RXD and numbers

传送门 有向图生成树计数 &#xff08;度数 ->入度->外向树&#xff09; BEST定理 &#xff08;不定起点的欧拉回路个数某点为根的外向树个数&#xff08;存在欧拉回路->每个点为根的外向树个数相等&#xff09;*&#xff08;每个点的度数&#xff08;存在欧拉回路-&g…

vue.js框架的生命周期:常用钩子函数

//组件实例化之前执行的函数 beforeCreate:function () { alert("组件实例化之前执行的函数") }, //组件实例化完毕执行的函数 created:function () { alert("组件实例化完毕执行的函数") }, //组件挂载前&#xff0c;页面仍未展示&#xff0c;但虚拟Dom已…

工作334:uni-控制整个label区域可选

<navigator url"../LevineHua-editor/LevineHua-editor" class"single"><u-form-item label"内容" label-width"100%" prop"content" class"label-left"><u-input placeholder"请输入公告内容…

零基础Python知识点回顾(一)

如果你是小白&#xff0c;建议只要安装官网的python-3.7.0-amd64.exe 然后在电脑cmd命令提示符 输入检查是否已经安装pip,一般安装了python都会有的。 >pip (有的话会提示一大串说明&#xff0c;没有的话会提示没有) 假设有了pip&#xff0c;下面来用pip 来安装…

工作335:uni-增加表单验证

<u-form-item prop"account"><u-input v-model"form.account" placeholder"请输入账号"></u-input></u-form-item><u-form-item prop"password"><u-input class"inp" v-model"form.p…

使用IDEA 创建SpringBoot项目

首先File ->New -> project ->Spring Initializr ->next 如果没有Spring Initializr 选择右下角config ->setting 搜索Springboot 勾选 然后apply ok 第二步&#xff1a; 在项目中写上自己需要的名称 type 选择 maven project ->next 第三步&#xff1a;…

工作335:uni-ele-el-date-picker限制选择时间

<el-form-item :label"index 1 .发布时间"><el-date-picker v-model"task.start_time" :picker-options"pickerOptions" :disabled"viewMode"/></el-form-item>pickerOptions: {disabledDate(time) {return time…