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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

}

转载于:https://my.oschina.net/fxdemon/blog/862634

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

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

相关文章

Redis: Useful commands

SELECT X - Select database (the X must be int) CONFIG GET databases - Get databases numberINFO keyspace - List Databases info LUSHDB - Removes data from your connections CURRENT database. FLUSHALL - Removes data from ALL databases.查看数据…

svn之check out没有下载so文件原因和解决办法

1、问题 linux 环境 svn checkout 发现少了so文件 2、解决办法 然后去看出我在windows上面svn checkout下来的项目&#xff0c;发现有so文件&#xff0c;然后再去查看&#xff0c;我把这个项目svn commit到另外一个svn路径的时候有没有提交so文件&#xff0c;结果发现真的没…

[C# 项目实战]: 制作一个备忘录(经典)

01—概述前几天群里有人问如何制作备忘录&#xff0c;感觉这样一个小实例挺适合新手们入门学习使用&#xff0c;所以就抽空做了出来。界面如下图&#xff1a;这个备忘录主要包括了如下功能&#xff1a;① 备忘录信息的增、删、改、查&#xff1b;② 备忘录时间到了以后进行语音…

RedHat 5.4下构建postfix全功能电子邮(七)-extmail extman平台-(下集)

2019独角兽企业重金招聘Python工程师标准>>> RedHat 5.4下构建postfix全功能电子邮&#xff08;七&#xff09;-extmail extman平台-&#xff08;下集&#xff09; 三、设置邮件系统的图形化日志信息 [rootmail ~]# ln -sf /usr/local/apache2/htdocs/extman/addon…

Android之moveTaskToBack()方法实现手动隐藏当前Activity

1、moveTaskToBack()方法说明 moveTaskToBack()方法&#xff1a;在activity中调用 moveTaskToBack (booleannonRoot)方法即可将activity 退到后台&#xff0c;注意不是finish()退出&#xff0c;按下返回键是退出 参数说明&#xff1a; 参数为false——代表只有当前activity是t…

JNI中的内存管理(转)

源&#xff1a;JNI中的内存管理 JNI 编程简介 JNI&#xff0c;Java Native Interface&#xff0c;是 native code 的编程接口。JNI 使 Java 代码程序可以与 native code 交互——在 Java 程序中调用 native code&#xff1b;在 native code 中嵌入 Java 虚拟机调用 Java 的代码…

C# 异步方法的异常处理

在使用异步方法时&#xff0c;应该知道错误的一些特殊处理方式。所有 ErrorHandling 示例的代码都使用了如下名称空间&#xff1a;SystemSystem.Threading.Tasks从一个简单的方法开始&#xff0c;它在延迟后抛出一个异常&#xff1a;static async Task ThrowAfter(int ms, stri…

oracle 创建日志文件,oracle创建日志文件

一团网资讯一团资讯 > oracle > oracle创建日志文件oracle创建日志文件2018-04-14 15:39:48 发布者&#xff1a;来源网络创建日志文件的语法如下&#xff1a;alter database database_name add logfile[group group_number](file_name[,file_name[,...]])[SIZE numbe…

Mark Down 使用实例

为什么80%的码农都做不了架构师&#xff1f;>>> Mark Down 使用实例 MarkDown是一个非常轻量级的 【标记语言】&#xff0c;有点有很多&#xff0c;书写比较快速&#xff0c;学习成本低&#xff0c;统一的排版模式&#xff0c;可导出 PDF HTML 等文档格式&#xff…

Android之在后台不显示activity方法

1、设置excludeFromRecents Androidmanifest.xml&#xff0c;设置Activity的属性&#xff1a;Android:excludeFromRecents"true"true时不显示&#xff1b;false默认显示。 2、start activity intent flag startactivity的时候用intent flag:FLAG_ACTIVITY_EXCLUDE_FR…

教育管理系统——android家长客户端

最近做了一个android的小项目&#xff0c;服务器端已经搭建好了&#xff0c;使用了spring MVC作为后端技术&#xff0c;发布了一系列web接口来接受客户端提交的数据和返回客户端请求的数据&#xff0c;web端使用了ext js来作为前端技术。同时还需要一个android客户端和ios客户端…

JoySSL付费版证书的优势

JoySSL付费版证书相比免费版有很多优势。首先&#xff0c;付费版证书通常由权威的CA&#xff08;证书颁发机构&#xff09;签发&#xff0c;在浏览器和操作系统中具有99.99%的兼容性&#xff0c;被主流浏览器如Chrome、Firefox、Safari和Edge等广泛支持和认可。这确保了无论用户…

Git命令集十三——快照操作

2019独角兽企业重金招聘Python工程师标准>>> Git命令集十三——快照操作 Git工具中提供了一个stash命令&#xff0c;这个命令的作用是创建快照。快照主要的用途是将当前未更新到缓存区的修改进行入栈保存&#xff0c;创建快照后&#xff0c;Git的状态会变回上一次提…

Asp.net core IdentityServer4与传统基于角色的权限系统的集成

img写在前面因为最近在忙别的&#xff0c;好久没水文了 今天来水一篇&#xff1b;在学习或者做权限系统技术选型的过程中&#xff0c;经常有朋友有这样的疑问 &#xff1a;“IdentityServer4的能不能做到与传统基于角色的权限系统集成呢&#xff1f;”“我的公司有几百个接口&a…

oracle 快捷 企业,Oracle自治数据库提供APEX 20.1,助企业快速构建应用

Oracle自治数据库(Oracle Autonomous Database)现已提供Oracle APEX 20.1&#xff0c;Oracle Application Express(APEX)是一个低代码应用开发平台&#xff0c;随附在所有Oracle数据库当中&#xff0c;企业也可以通过所有Oracle数据库云服务来使用&#xff0c;包括Oracle自治数…

【转】CSS样式覆盖规则

大家都知道CSS的全称叫做“层叠样式表”&#xff0c;但估计很多人都不知道“层叠”二字的含义。其实&#xff0c;“层叠”指的就是样式的覆盖&#xff0c;当一个元素被运用上多种样式&#xff0c;并且出现重名的样式属性时&#xff0c;浏览器必须从中选择一个属性值&#xff0c…

C之memset、memcpy、strcpy、strncpy区别

1 memset memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘\0’, memset可以方便的清空一个结构类型的变量或数组。 char a[100]; memset(a, \0, sizeof(a)); struct student {char name[16];int age; }; struct student s…

Cachefiled

NFS不同共享客户端间的数据不同步 问题现象 当您用台ECS挂载同一个NFS文件系统&#xff0c;在ECS-A上append写文件&#xff0c;在ECS-B用tail -f观察文件内容的变化。在ECS-A写完之后&#xff0c;在ECS-B看到文件内容变化会有10-30秒的延时。然而相同的场景下&#xff0c;如果直…

算法小白——基本排序算法入门

计算的 时间复杂度&#xff08;最差、平均、和最好性能&#xff09;&#xff0c;依据列表&#xff08;list&#xff09;的大小(n)。一般而言&#xff0c;好的性能是O(n log n)&#xff0c;且坏的性能是O(n^2)。对于一个排序理想的性能是O(n)。仅使用一个抽象关键比较运算的排序…

使用Dynamic LINQ创建高级查询服务

前言在以前的文章中&#xff0c;我们介绍了使用AutoFilterer.Generators创建高级查询服务。但是&#xff0c;AutoFilterer.Generators只能提供简单的范围筛选&#xff1a;今天&#xff0c;我们介绍如何使用Dynamic LINQ轻松实现更强大的高级查询服务。Demo创建ASP.NET Core Web…