MyCat分表分库规则实现
来源:互联网 发布:java分布式开发是什么 编辑:程序博客网 时间:2024/06/06 10:44
/***
* 先根据截取字段的日期分组,再根据字段值数据按天入表
* @author Fx_demon
*
*/
public class PartitionBySubstringRangeDateDay extends AbstractPartitionAlgorithm
implements RuleAlgorithm {
private static final long serialVersionUID = -6211713068380831727L;
private static final Logger LOGGER = LoggerFactory.getLogger(PartitionBySubstringRangeDateDay.class);
private int startIndex; // 从第N位开始截取字符串
private String dateFormat;// 日期格式 ,yyMMdd或者yyyyMMdd
private int dateFormatLength;
/** 日期分组 */
private List<String[]> rangeDate;
private int rangeDateSize;
/** 每个分组对应的数据库节点数量 ,逗号分隔, 配置如 3 , 6 */
private int[] partitionCount;
private PartitionByDate[] partitionByDay;
@Override
public void init() {
dateFormatLength = dateFormat.length();
rangeDateSize = rangeDate.size();
if (rangeDateSize != partitionCount.length) {
throw new IllegalArgumentException("rangeDate not match partitionCount");
}
}
@Override
public Integer calculate(String columnValue) {
String date = columnValue.substring(startIndex, startIndex + dateFormatLength);
date = date.replace("-", "");
int count = 0;
for (int i = 0; i < rangeDateSize; i++) {
String rangeDateStart = rangeDate.get(i)[0].replace("-", "");
String rangeDateEnd = rangeDate.get(i)[1].replace("-", "");
if (date.compareTo(rangeDateStart) >= 0 && date.compareTo(rangeDateEnd) <= 0) {
this.partitionByDay[i].setsBeginDate(rangeDate.get(i)[0]);
this.partitionByDay[i].setsEndDate(rangeDate.get(i)[1]);
return partitionByDay[i].calculate(columnValue) + count;
} else {
count += partitionCount[i];
}
}
return null;
}
// 在columnValue截取日期的起始记录
public void setStartIndex(String startIndex) {
this.startIndex = Integer.parseInt(startIndex);
}
// 数据库节点的数量
public void setPartitionCount(String partitionCount) {
String[] partitionCountStr = partitionCount.split(",");
this.partitionCount = new int[partitionCountStr.length];
this.partitionByDay = new PartitionByDate[partitionCountStr.length];
for (int i = 0; i < partitionCountStr.length; i++) {
this.partitionCount[i] = Integer.parseInt(partitionCountStr[i]);
this.partitionByDay[i] = new PartitionByDate();
this.partitionByDay[i].setDateFormat(dateFormat);
this.partitionByDay[i].setsBeginDate("2017-01-01");
this.partitionByDay[i].setsPartionDay("1");
this.partitionByDay[i].init();
}
}
/** 日期分组,逗号分隔如 ,【 20170101@20170331 , 20170401@20170630】 或 【 20170101@20170331 , 2017-04-01@2017-06-30】*/
public void setRangeDate(String rangeDateStr) {
String[] rangeDateArr = rangeDateStr.split(",");
this.rangeDate = new LinkedList<>();
for (String rangeDate : rangeDateArr) {
String[] date = rangeDate.trim().split("@");
date[0] = date[0].trim();
date[1] = date[1].trim();
this.rangeDate.add(date);
}
}
public void setDateFormat(final String dateFormat) {
if ((!"yyMMdd".equals(dateFormat) && !"yyyyMMdd".equals(dateFormat) && ( !"yyyy-MM-dd".equals(dateFormat))) ) {
throw new IllegalArgumentException("only support yyyyMMdd or yyMMdd or yyyy-MM-dd ");
}
this.dateFormat = dateFormat;
}
@Override
public int getPartitionNum() {
int sum = 0;
for (int i : this.partitionCount)
sum += i;
return sum;
}
}
- MyCat分表分库规则实现
- mycat分片规则
- mycat常用分片规则
- mycat 分片规则
- mycat分片JOIN,分片规则
- Mycat常用的分片规则
- Mycat 分片规则---不以规矩,不能成方圆
- Mycat 源码修改-实现分表规则:按天分表和取摸分表查询
- mycat 集群实现过程
- mycat实现读写分离
- mycat分布式mysql中间件(分片规则)
- MyCAT常用分片规则之分片枚举
- MyCAT常用分片规则之分片枚举
- mycat分布式mysql中间件(分片规则)
- MyCat多重规则哈希分片
- Mycat系列—常用的分片规则
- Mycat分布式事务的实现
- mycat实现mysql读写分离
- MySQL数据库数据操作
- 机器学习之问题描述——聚类Clustering
- maven+spring mvc环境搭建xml版(无web.xml,maven jetty插件运行)
- 《谍影重重5》中的黑科技
- Twitter的分布式自增ID算法snowflake (Java版)
- MyCat分表分库规则实现
- casperjs使用说明-使用命令行
- Serverless架构的演进
- Map内部类Entry
- Codeforces 364 A Matrix 题解(矩形构造)
- 学习笔记之----Adapter的封装(RecyclerView)
- 每天一个 Linux 命令(8):cp 命令
- 8、Python正则表达式指南
- java eclipse 简单的局域网聊天 webservice