您的位置:首页 > 数据库

【数据库中间件】MyCat分表分库规则实现

2017-03-19 00:00 1071 查看
/***
* 先根据截取字段的日期分组,再根据字段值数据按天入表
* @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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: