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;
    }

}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我的耕地己确权被他人侵权怎么办 掌上川电登录密码忘记了怎么办 华为商城不小心点了确认收货怎么办 买的认证服务号没有微信支付怎么办 手机微信里的外网链接打不开怎么办 微信违规无法加入群聊怎么办 苹果手机微信储存空间不足怎么办 拼多多砍价砍不到0元怎么办 妻子婚内出轨我的熟人怎么办 父亲怀疑母亲有外遇作为儿子怎么办 老婆出轨我总心理过不去坎该怎么办 失业人员离培训机构远了怎么办 遇到申请假冒商品的仅退款怎么办 微信被骗什么消息都不知道怎么办 微信用手机登录显示未注册怎么办 唯品会海淘订单取消不了怎么办 大排量摩托芯片钥匙断了怎么办 夏天太热在宿舍没空调怎么办? 汽车钥匙掉了怎么办半路到不了家 当顾客说产品太贵的时候 怎么办 邮件还没有下载被发送者删除怎么办 绝地求生号被盗了怎么办邮箱没有用 暴雪忘了密码换了手机号怎么办 华为荣耀10看电视缓冲太慢怎么办 交易猫梦幻西游手游恶意仲裁怎么办 银色高跟鞋前面尖尖蹭掉色了怎么办 苹果账号邮箱和密码都忘了怎么办 网易云密码忘记了怎么办手机号换了 超市买过期东西但没有小票怎么办 网购退货商家已收货而不退款怎么办 手机号被别人注册了京东怎么办 中通快递把我发的货弄坏了了怎么办 在淘宝获取不了丰巢柜提货码怎么办 京东快递提货码数手机号错了怎么办 腾讯手游助手不能玩刺激战场怎么办 刚收的京东快递质量有问题怎么办 拼多多买家接受信息没有声音怎么办 苹果6s外放声音有杂音怎么办 华为手机不小心把视频删了怎么办 电脑做完系统不显示声卡了怎么办 苹果手机自带浏览器看视频卡怎么办