System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。 参数名: length 在 System.String.Substring(Int32 startIndex, Int32 length) 在 zhuanliShow.Bind()
【技术实现步骤摘要】
本专利技术涉及数据处理,特别涉及一种分表查询方法。
技术介绍
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的标签时,调用多条查询处理器执行
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的标签时,调用多条查询处理器执行多条记录的分表查询;当查询类型判断器获...
【专利技术属性】
技术研发人员:李宝君,何玉华,
申请(专利权)人:全通金信控股广东有限公司,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。