CN114328529A - 一种mybatis拦截器对大数据表分表查询方法和系统 - Google Patents
一种mybatis拦截器对大数据表分表查询方法和系统 Download PDFInfo
- Publication number
- CN114328529A CN114328529A CN202111639118.5A CN202111639118A CN114328529A CN 114328529 A CN114328529 A CN 114328529A CN 202111639118 A CN202111639118 A CN 202111639118A CN 114328529 A CN114328529 A CN 114328529A
- Authority
- CN
- China
- Prior art keywords
- data
- interceptor
- code
- query
- sub
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种mybatis拦截器对大数据表分表查询方法和系统,所述方法包括如下步骤:获取单据流程日志数据,并将所述单据流程日志数据进行分表;创建自定义注解,其中所述自定义注解包括数组属性和数组算法策略类字节码;在所述单据流程日志数据分表的映射文件上加入所述自定义注解;创建拦截器,通过所述拦截器拦截数据表查询SQL,在执行分表算法后执行SQL并返回数据。使得在实现复杂SQL的基础上,将风险控制在自身的代码范围内,可以减少或避免因为中间件的不兼容复杂SQL导致分表错误并难以定位问题,从而可以减少系统的复杂度。
Description
技术领域
本发明涉及大数据查询技术领域,特别涉及一种mybatis拦截器对大数据表分表查询方法和系统
背景技术
系统在使用进行中,随着用户数的增加,某些表的数据量增加巨快,导致后续这些大数据表的时候,由于数据量大,表索引失效,会去全表扫描数据库查询数据,导致查询缓慢.现在项目中使用shardingjdbc中间件,根据配置规则去解析sql实现分表查询。
上述现有技术中,项目代码中的sql部分比较复杂,多表关联、嵌套查询等一些复杂的SQL以及调用了一些自定义函数,shardingjdbc中间件根据不同的版本解析这些sql可能不兼容,存在一些未知的bug,难以定位到问题。
发明内容
本发明其中一个发明目的在于提供一种mybatis拦截器对大数据表分表查询方法和系统,所述方法和系统通过mybatis拦截器配合自定义注解,以实现大数据分表,从而使得在实现复杂SQL的基础上,将风险控制在自身的代码范围内,可以减少或避免因为中间件的不兼容复杂SQL导致分表错误并难以定位问题,从而可以减少系统的复杂度。
本发明另一个发明目的在于提供一种mybatis拦截器对大数据表分表查询方法和系统,所述方法和系统在sql执行前进行拦截,且在sql中替换原名,无需修改原来的代码,便于业务的拓展和对接。
本发明另一个发明目的在于提供一种mybatis拦截器对大数据表分表查询方法和系统,所述方法和系统所述的分表字段可以通过自定义算法实现,因此提高了系统的灵活性。
为了实现至少一个上述发明目的,本发明进一步提供一种mybatis拦截器对大数据表分表查询方法,所述方法包括如下步骤:
获取单据流程日志数据,并将所述单据流程日志数据进行分表;
创建自定义注解,其中所述自定义注解包括数组属性和数组算法策略类字节码;
在所述单据流程日志数据分表的映射文件上加入所述自定义注解;
创建拦截器,通过所述拦截器拦截数据表查询SQL,在执行分表算法后执行SQL并返回数据。
根据本发明其中一个较佳实施例,创建拦截器ShardTableInterceptor,在拦截器中加入mybatis注解@Intercepts,在获取所述数据表查询SQL后被所述拦截器ShardTableInterceptor拦截。
根据本发明另一个较佳实施例,所述分表算法包括:获取单据流程日志数据表的表格数据编码form_data_code作为分表键,对所述表格数据编码form_data_code进行哈希运算,将哈希运算的结果进行取余计算作为键值。
根据本发明另一个较佳实施例,所述分表算法包括:
拦截器ShardTableInterceptor拦截所述数据表查询SQL后,获取全局操作对象MetaObject,并判断所述全局操作对象中是否存在自定义注解@SegmentTable,若不存在所述自定义注解@SegmentTable,则说明数据表查询SQL对应的映射文件Mapper无需分表,跳过分表操作,直接执行原数据表查询SQL。
根据本发明另一个较佳实施例,所述分表算法包括:若全局操作对象MetaObject存在所述自定义注解@SegmentTable,进一步获取分表的表名和分表策略字节码,若判断该表名不存在,则执行原数据表查询SQL;若判断分别策略不存在,则执行原数据表查询SQL;若分表表名和分表策略字节码并无对应关系,则执行原数据表查询SQL;否则执行分表策略。
根据本发明另一个较佳实施例,在获取正确的分表表名和分表策略字节码后,获取分表字段的表格数据编码form_data_code所对应的值,进一步判断所述表格数据编码form_data_code对应的值是否为空值,若为空值,则说明原数据表查询SQL没有分表字段,返回错误信息。
根据本发明另一个较佳实施例,在获取正确的分表表名和分表策略字节码后,获取分表字段的表格数据编码form_data_code所对应的值,并判断所述表格数据编码form_data_code所对应的值不为空,则对所述表格数据编码form_data_code进行哈希运算后进行取余计算。
根据本发明另一个较佳实施例,获取表格数据编码form_data_code进行哈希运算后进行取余计算结果值,将所述取余计算结果值和原数据表进行拼接,生成新分表名,并替换原数据表查询SQL中的分表名,形成新的数据表查询SQL执行分表查询操作。
为了实现至少一个上述发明目的,本发明进一步提供一种mybatis拦截器对大数据表分表查询系统,所述系统执行所述一种mybatis拦截器对大数据表分表查询方法。
本发明进一步提供一种计算机可读存储介质,述计算机可读存储介质存储有计算机程序,所述计算机程序可被处理器执行所述一种mybatis拦截器对大数据表分表查询方法。
附图说明
图1显示的是本发明一种mybatis拦截器对大数据表分表查询方法的流程示意图。
具体实施方式
以下描述用于揭露本发明以使本领域技术人员能够实现本发明。以下描述中的优选实施例只作为举例,本领域技术人员可以想到其他显而易见的变型。在以下描述中界定的本发明的基本原理可以应用于其他实施方案、变形方案、改进方案、等同方案以及没有背离本发明的精神和范围的其他技术方案。
可以理解的是,术语“一”应理解为“至少一”或“一个或多个”,即在一个实施例中,一个元件的数量可以为一个,而在另外的实施例中,该元件的数量可以为多个,术语“一”不能理解为对数量的限制。
请结合图1,本发明提供了一种mybatis拦截器对大数据表分表查询方法和系统,其中所述方法包括如下步骤:首先需要创建数据表的分表,其中所述数据表process_log为单据流程日志记录表,用于记录单据流程日志信息。本发明举例建立所述数据表process_log的20个分表,所述20个分表分别为:process_log_0、process_log_1、process_log_2、process_log_3、...、process_log_18、process_log_19,其中所述分表的结构和原数据表结构相同。
在创建数据表的分表后,创建自定义注解@SegmentTable,其中所述自定义注解包含两个属性,分别为数组tableName,其中所述数组tableName为需要分表的原表名,和数组算法类策略类字节码strategyClazz,其中所述数组算法类策略类字节码用于执行对应的分表算法,其中所述自定义注解用于加入到单据流程日志记录表process_log对应的映射表ProcessLogMapper.java中,生成自定义注解配置:tableName={‘process_log’},strategyClass={‘ProcessLogStrategy.class’}。
值得一提的是,本发明创建拦截器,用于在执行数据表查询SQL前执行拦截操作。具体方法如下:创建拦截器ShardTableInterceptor,在所述拦截器中ShardTableInterceptor添加mybatis注解@Intercepts,需要说明的是mybatis注解@Intercepts作为拦截指令,可以在所述数据表查询sql执行前被所述拦截器拦截。
在拦截获取所述数据表查询sql后,获取所述数据表查询sql中的表格数据编码字段form_data_code作为分表键,进一步对所述表格数据编码字段form_data_code进行哈希运算,由于本发明所举例的分表个数为20个,因此需要对表格数据编码字段form_data_code的哈希运算结果和20进行取余计算,获取所述取余计算的绝对值,可以得到0-19之间的数值,作为所述分表键。
需要说明的是,当用户在系统中打开单据页面详情时,所述系统就会自动地查询所述单据页面所对应的单据日志流程表process_log。且进一步调用单据日志流程表的映射文件ProcessLogMapper.java。可以将拼接的自定义注解的参数拼接后装入拦截器拦截到的数据表查询sql中用于执行分表算法。
所述分表算法包括如下步骤:所述拦截器ShardTableInterceptor在拦截到数据表查询sql时,获取全局操作对象MetaObject,并判断所述全局操作对象MetaObject中是否存在自定义注解@SegmentTable,若不存在所述自定义注解@SegmentTable,则表明拦截到的数据表查询sql所对应的映射文件ProcessLogMapper.java不需要执行分表操作,则直接跳过所述分表操作并直接执行所述数据表查询sql的命令。
若从所述拦截到的数据表查询sql中查询到自定义注解@SegmentTable,则说明所述拦截到的数据表查询sql需要进行分表处理,获取所述自定义注解@SegmentTable中配置的参数,其中自定义注解配置的参数包括表名和分表策略字节码,用于针对原表名执行分表查询操作。所述分表策略字节码包含分表算法,所述分表算法包括:
判断分表的表名是否存在,若不存在,则直接跳过分表操作,执行原数据表查询sql;若判断分表策略不存在,则直接跳过分表操作,执行原数据表查询sql;若分表表名和分表策略无对应关系,则直接跳过分表操作,执行原数据表查询sql,需要说明的是,所述分表表名和分表策略的对应关系预先保存的。因此只要所述自定义注解中配置的分表表明和分别策略存在差错就不再执行分表操作,从而使得整个分表错误只出现在分表算法所在的代码范围内,无需担心中间件的不兼容问题。
本发明进一步对原数据表查询sql进行如下处理:判断原数据表查询sql是否存在需要分表的表名,若不存在则直接跳过执行原数据表查询sql,若存在分表表名,则采用算法策略的字节码反射获取具体的分表算法策略,并判断该策略是否存在,若不存在则跳过分表操作执行原数据表查询sql。若存在具体的分表算法,则根据所述分表算法获取具体的表名,其中所述分表算法还包括:获取执行sql参数,并获取分表字段表格数据编码formDataCod的实际值,并判断所述表格数据编码formDataCod的实际值是否为空,若为空则说明不存在分表字段,则返回错误信息,若所述表格数据编码formDataCod不为空,则对所述表格数据编码formDataCod进行哈希运算hashCode(),将哈希运算的结果和20进行取余计算,获取取余计算结果的绝对值。举例来说,若取余计算结果的绝对值为7,则进一步将原表名和所述取余计算结果的绝对值进行拼接得到proceess_log_7,返回该拼接后的表名作为新表名,将原数据表查询sql中的所有原表名procees_log全部提换为所述新表名proceess_log_7,进一步将新表面组装成新的用于执行的sql,在所述全局对象MetaObject中设置最终执行新sql,通过执行后,原数据表查询sql就可以查询操作表proceess_log_7,从而可以实现分表的目的,同时也降低了系统的复杂度,便于系统功能的扩展。
特别地,根据本发明公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分从网络上被下载和安装,和/或从可拆卸介质被安装。在该计算机程序被中央处理单元(CPU)执行时,执行本申请的方法中限定的上述功能。需要说明的是,本申请上述的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是但不限于电、磁、光、电磁、红外线段、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线段的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本申请中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本申请中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线段、电线段、光缆、RF等等,或者上述的任意合适的组合。
附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,该模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
本领域的技术人员应理解,上述描述及附图中所示的本发明的实施例只作为举例而并不限制本发明,本发明的目的已经完整并有效地实现,本发明的功能及结构原理已在实施例中展示和说明,在没有背离所述原理下,本发明的实施方式可以有任何变形或修改。
Claims (10)
1.一种mybatis拦截器对大数据表分表查询方法,其特征在于,所述方法包括如下步骤:
获取单据流程日志数据,并将所述单据流程日志数据进行分表;
创建自定义注解,其中所述自定义注解包括数组属性和数组算法策略类字节码;
在所述单据流程日志数据分表的映射文件上加入所述自定义注解;
创建拦截器,通过所述拦截器拦截数据表查询SQL,在执行分表算法后执行SQL并返回数据。
2.根据权利要求1所述的一种mybatis拦截器对大数据表分表查询方法,其特征在于,创建拦截器ShardTableInterceptor,在拦截器中加入mybat is注解@I ntercepts,在获取所述数据表查询SQL后被所述拦截器ShardTableInterceptor拦截。
3.根据权利要求1所述的一种mybatis拦截器对大数据表分表查询方法,其特征在于,所述分表算法包括:获取单据流程日志数据表的表格数据编码form_data_code作为分表键,对所述表格数据编码form_data_code进行哈希运算,将哈希运算的结果进行取余计算作为键值。
4.根据权利要求1所述的一种mybatis拦截器对大数据表分表查询方法,其特征在于,所述分表算法包括:
拦截器ShardTableInterceptor拦截所述数据表查询SQL后,获取全局操作对象MetaObject,并判断所述全局操作对象中是否存在自定义注解@SegmentTable,若不存在所述自定义注解@SegmentTable,则说明数据表查询SQL对应的映射文件Mapper无需分表,跳过分表操作,直接执行原数据表查询SQL。
5.根据权利要求4所述的一种mybatis拦截器对大数据表分表查询方法,其特征在于,所述分表算法包括:若全局操作对象MetaObject存在所述自定义注解@SegmentTable,进一步获取分表的表名和分表策略字节码,若判断该表名不存在,则执行原数据表查询SQL;若判断分别策略不存在,则执行原数据表查询SQL;若分表表名和分表策略字节码并无对应关系,则执行原数据表查询SQL;否则执行分表策略。
6.根据权利要求1所述的一种mybatis拦截器对大数据表分表查询方法,其特征在于,在获取正确的分表表名和分表策略字节码后,获取分表字段的表格数据编码form_data_code所对应的值,进一步判断所述表格数据编码form_data_code对应的值是否为空值,若为空值,则说明原数据表查询SQL没有分表字段,返回错误信息。
7.根据权利要求1所述的一种mybatis拦截器对大数据表分表查询方法,其特征在于,在获取正确的分表表名和分表策略字节码后,获取分表字段的表格数据编码form_data_code所对应的值,并判断所述表格数据编码form_data_code所对应的值不为空,则对所述表格数据编码form_data_code进行哈希运算后进行取余计算。
8.根据权利要求7所述的一种mybatis拦截器对大数据表分表查询方法,其特征在于,获取表格数据编码form_data_code进行哈希运算后进行取余计算结果值,将所述取余计算结果值和原数据表进行拼接,生成新分表名,并替换原数据表查询SQL中的分表名,形成新的数据表查询SQL执行分表查询操作。
9.一种mybatis拦截器对大数据表分表查询系统,其特征在于,所述系统执行权利要求1-8中任意一项所述的一种mybatis拦截器对大数据表分表查询方法。
10.一种计算机可读存储介质,其特征在于,述计算机可读存储介质存储有计算机程序,所述计算机程序可被处理器执行权利要求1-8中任意一项所述的一种mybatis拦截器对大数据表分表查询方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111639118.5A CN114328529A (zh) | 2021-12-29 | 2021-12-29 | 一种mybatis拦截器对大数据表分表查询方法和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111639118.5A CN114328529A (zh) | 2021-12-29 | 2021-12-29 | 一种mybatis拦截器对大数据表分表查询方法和系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114328529A true CN114328529A (zh) | 2022-04-12 |
Family
ID=81016812
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111639118.5A Pending CN114328529A (zh) | 2021-12-29 | 2021-12-29 | 一种mybatis拦截器对大数据表分表查询方法和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114328529A (zh) |
-
2021
- 2021-12-29 CN CN202111639118.5A patent/CN114328529A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111522816B (zh) | 基于数据库引擎的数据处理方法、装置、终端及介质 | |
CN110908997B (zh) | 数据血缘构建方法、装置、服务器及可读存储介质 | |
KR102230661B1 (ko) | Sql 검토 방법, 장치, 서버 및 저장 매체 | |
US7676453B2 (en) | Partial query caching | |
US11093461B2 (en) | Method for computing distinct values in analytical databases | |
CN110795455A (zh) | 依赖关系解析方法、电子装置、计算机设备及可读存储介质 | |
US8812492B2 (en) | Automatic and dynamic design of cache groups | |
CN109408507B (zh) | 多属性数据的处理方法、装置、设备及可读存储介质 | |
KR102368775B1 (ko) | 인덱스 관리 방법, 장치, 기기 및 저장 매체 | |
CN112395303A (zh) | 查询的执行方法、装置、电子设备及计算机可读介质 | |
CN113821496B (zh) | 数据库迁移方法、系统、设备及计算机可读存储介质 | |
CN113468204A (zh) | 一种数据查询方法、装置、设备、介质 | |
CN113568924A (zh) | 一种数据处理方法、装置、电子设备及存储介质 | |
CN106570095B (zh) | 一种xml数据的操作方法及设备 | |
KR20230129555A (ko) | 클라우드 리소스의 자바스크립트 객체 표기(json) 쿼리조인 | |
CN115952203B (zh) | 数据查询方法、设备、系统及存储介质 | |
CN117421302A (zh) | 一种数据处理方法及相关设备 | |
CN114328529A (zh) | 一种mybatis拦截器对大数据表分表查询方法和系统 | |
US11074401B2 (en) | Merging delta object notation documents | |
CN112000671A (zh) | 基于区块链的数据库表处理方法、装置及系统 | |
CN112749189A (zh) | 数据查询方法及装置 | |
US10929396B1 (en) | Multi-type attribute index for a document database | |
US12130814B2 (en) | Late materialization of queried data in database cache | |
CN114490095B (zh) | 请求结果的确定方法和装置、存储介质及电子装置 | |
US20240330286A1 (en) | Apparatus, method and storage medium for database query |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |