System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。 参数名: length 在 System.String.Substring(Int32 startIndex, Int32 length) 在 zhuanliShow.Bind() 一种分表查询方法技术_技高网

一种分表查询方法技术

技术编号:41400386 阅读:11 留言:0更新日期:2024-05-20 19:25
本发明专利技术公开了一种分表查询方法,属于数据处理技术领域,包括:当dao层的接口方法被调用时,dao层的拦截器DaoShardSelectInterceptor中的元数据收集器收集元数据信息;拦截器DaoShardSelectInterceptor中的查询类型判断器根据元数据信息判断是否执行分表查询,若是则调用拦截器DaoShardSelectInterceptor中的查询处理器执行分表查询。所述分表查询方法解决了现有的分表查询方式便捷度和泛用性低下的问题。

【技术实现步骤摘要】

本专利技术涉及数据处理,特别涉及一种分表查询方法


技术介绍

1、关系型数库如mysql和oracle,当单表的数据量增加到一定程度时,该表的查询就会变得越来越慢,这时候就要考虑分表。分表有垂直分表和水平分表,一般根据时间来分表的方式称为垂直分表。现在基于spring和mybatis的分表方案大多是,如图1所示,在dao层传参的时候,方法多加一个时间参数,然后在mybatis的自定义拦截器中获取要执行的sql,并将sql中所指定的表名替换成表名及表号,这样原sql就变成了查分表的sql。例如,yearmonth传参202401,要进行分表的表名为order,sql为select id,name,fee fromorder where mchid=‘1023’,将变为:sql为select id,name,fee from order_202401where mchid=‘1023’。

2、该方案在使用上,每次调用只能查某个分表的数据,受到的限制很大。当需要执行多个分表查数据时,需要使用者自己写for循环遍历所有分表。此外,虽然mybatis的插件tkmapper提供了一些常用的dao层的查询方法,如:selectbyprimarykey和selectone,但因为这些方法是tkmapper提供的,使用者不能在这些方法中加时间参数。以上两点都给使用者带来了极大的使用不便,导致分表查询的便捷度和泛用性低下。


技术实现思路

1、为了克服现有技术存在的缺陷,本专利技术提供一种分表查询方法,以解决上述的问题。

2、本专利技术解决其技术问题所采用的技术方案是:一种分表查询方法,包括以下步骤:

3、s1:当dao层的接口方法被调用时,dao层的拦截器daoshardselectinterceptor中的元数据收集器收集元数据信息,所述元数据信息包括方法名、方法的注解、参数注解@shardparam所标注的时间参数和实现了selectmultiplefunctionforlist接口的参数或selectonefunctionforcontinue接口的参数,其中方法的注解为@shardselectmultiple、@shardselectone或空中的其中一种;

4、s2:拦截器daoshardselectinterceptor中的查询类型判断器根据元数据信息判断是否执行分表查询,若是则调用拦截器daoshardselectinterceptor中的查询处理器执行分表查询,其中分表查询包括多条记录的分表查询和单条记录的分表查询,所述查询处理器包括多条查询处理器和单条查询处理器,通过多条查询处理器执行多条记录的分表查询,通过单条查询处理器执行单条记录的分表查询。

5、值得说明的是,在所述步骤s2后还包括步骤s3,所述步骤s3包括:

6、利用mybatis的拦截器shardselectinterceptor从sql上下文的sqlcontext中取出参数注解@shardparam所标注的时间参数,并附加到sql语句中所指定的表名,以将原sql语句更新为分表查询语句。

7、可选的,在所述步骤s1中,参数注解@shardparam所标注的时间参数为空、只有一个时间参数被标注且该时间参数的属性sectiontype=equal、只有一个时间参数被标注且时间参数的属性sectiontype=gte或sectiontype=lte和有两个时间参数被标注中的其中一种,其中当有两个时间参数被标注时,其中一个被标注时间参数的属性sectiontype=gte,另一个被标注的时间参数的属性sectiontype=lte,sectiontype为参数注解@shardparam所标注的时间参数的属性,equal表示等于,gte表示大于等于,lte表示小于等于。

8、优选的,在所述步骤s2中,当查询类型判断器获取到方法的注解@shardselectmultiple的标签时,调用多条查询处理器执行多条记录的分表查询;当查询类型判断器获取到方法的注解@shardselectone的标签时,调用单条查询处理器执行单条记录的分表查询。

9、具体地,在所述步骤s2中,调用多条查询处理器执行多条记录的分表查询的步骤具体包括:

10、s211:获取方法的注解@shardselectmultiple中的type值,然后根据type值取selectmultiplefunctionforlist接口的实现;

11、s212:调用selectmultiplefunctionforlist接口的newresult方法,对汇总临时结果值进行初始化;

12、s213:根据元数据收集器中获取到的参数注解@shardparam所标注的时间参数,确定要遍历的时间范围;

13、其中每次遍历都先取当前遍历到的时间年月设置到sqlcontext中;然后调用dao层的接口方法的实现得到结果和单次临时结果值,得到的结果作为selectmultiplefunctionforlist接口的eachreturn方法中的currentreturnlist参数,得到的单次临时结果值作为selectmultiplefunctionforlist接口的eachreturn方法中的result参数,以汇总到所述汇总临时结果值;然后调用selectmultiplefunctionforlist接口的eachreturn方法并将返回作为遍历的下一次的单次临时结果值;

14、s214:遍历结束后将汇总临时结果值作为最终结果返回。

15、值得说明的是,在所述步骤s2中,调用单条查询处理器执行单条记录的分表查询的步骤具体包括:

16、s221:获取方法的注解@shardselectone中的continuewhen值,然后根据continuewhen值取selectonefunctionforcontinue接口的实现;

17、s222:调用selectonefunctionforcontinue的newresult方法,作为假设结果值;

18、s223:然后根据元数据收集器中获取到的参数注解@shardparam所标注的时间参数,确定要遍历的时间范围;

19、其中每次遍历都先取当前遍历到的时间年月设置到sqlcontext中,然后再调用dao层的接口方法的实现得到实际结果值,得到的实际结果值作为selectonefunctionforcontinue接口的iscontinune方法中的currentresult参数并调用该方法;

20、s224:若iscontinune方法返回falis,则提前结束遍历,并将该次遍历的实际结果值作为结果返回;若遍历结束依然没返回,则将假设结果值作为结果返回。

21、优选的,在所述步骤s2中,当查询类型判断器获取到参数注解@shardparam所标注的时本文档来自技高网...

【技术保护点】

1.一种分表查询方法,其特征在于,包括以下步骤:

2.根据权利要求1所述的一种分表查询方法,其特征在于:在所述步骤S2后还包括步骤S3,所述步骤S3包括:

3.根据权利要求2所述的一种分表查询方法,其特征在于:在所述步骤S1中,参数注解@ShardParam所标注的时间参数为空、只有一个时间参数被标注且该时间参数的属性sectionType=equal、只有一个时间参数被标注且时间参数的属性sectionType=gte或sectionType=lte和有两个时间参数被标注中的其中一种,其中当有两个时间参数被标注时,其中一个被标注时间参数的属性sectionType=gte,另一个被标注的时间参数的属性sectionType=lte,sectionType为参数注解@ShardParam所标注的时间参数的属性,equal表示等于,gte表示大于等于,lte表示小于等于。

4.根据权利要求3所述的一种分表查询方法,其特征在于:在所述步骤S2中,当查询类型判断器获取到方法的注解@ShardSelectMultiple的标签时,调用多条查询处理器执行多条记录的分表查询;当查询类型判断器获取到方法的注解@ShardSelectOne的标签时,调用单条查询处理器执行单条记录的分表查询。

5.根据权利要求4所述的一种分表查询方法,其特征在于:在所述步骤S2中,调用多条查询处理器执行多条记录的分表查询的步骤具体包括:

6.根据权利要求5所述的一种分表查询方法,其特征在于:在所述步骤S2中,调用单条查询处理器执行单条记录的分表查询的步骤具体包括:

7.根据权利要求6所述的一种分表查询方法,其特征在于:在所述步骤S2中,当查询类型判断器获取到参数注解@ShardParam所标注的时间参数时,调用查询处理器执行分表查询。

8.根据权利要求7所述的一种分表查询方法,其特征在于:在所述步骤S2中,当方法名为selectByPrimaryKey或者selectOne时,调用单条查询处理器执行单条记录的分表查询;当方法名为selectAll、selectCount、selectByExample、selectCountByExample、selectByExampleAndRowBounds、selectByRowBounds或者select时,调用查询处理器执行分表查询。

...

【技术特征摘要】

1.一种分表查询方法,其特征在于,包括以下步骤:

2.根据权利要求1所述的一种分表查询方法,其特征在于:在所述步骤s2后还包括步骤s3,所述步骤s3包括:

3.根据权利要求2所述的一种分表查询方法,其特征在于:在所述步骤s1中,参数注解@shardparam所标注的时间参数为空、只有一个时间参数被标注且该时间参数的属性sectiontype=equal、只有一个时间参数被标注且时间参数的属性sectiontype=gte或sectiontype=lte和有两个时间参数被标注中的其中一种,其中当有两个时间参数被标注时,其中一个被标注时间参数的属性sectiontype=gte,另一个被标注的时间参数的属性sectiontype=lte,sectiontype为参数注解@shardparam所标注的时间参数的属性,equal表示等于,gte表示大于等于,lte表示小于等于。

4.根据权利要求3所述的一种分表查询方法,其特征在于:在所述步骤s2中,当查询类型判断器获取到方法的注解@shardselectmultiple的标签时,调用多条查询处理器执行多条记录的分表查询;当查询类型判断器获...

【专利技术属性】
技术研发人员:李宝君何玉华
申请(专利权)人:全通金信控股广东有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1