基于高级语言并发聚合计算的分库分表merge查询方法

文档序号:9417508阅读:1774来源:国知局
基于高级语言并发聚合计算的分库分表merge查询方法【
技术领域
】[0001]本发明涉及一种在传统关系型数据库分库分表基础上进行SQLmerge查询的方法,具体涉及一种基于高级语言并发聚合计算的分库分表merge查询方法,属于信息
技术领域
。【
背景技术
】[0002]随着互联网技术和物联网的发展,很多传统行业投入到了互联网中来,产生了大量的“互联网+”的需求,这些需求很多是基于大数据的。而目前流行的互联网大数据解决方案,是基于分布式数据库和分布式的MapReduce方案的。[0003]分布式数据库和分布式MapReduce解决方案是当今非常流行的大数据计算框架,具有计算能力强、容错性和数据可用性强、可扩展性强等特点。[0004]然而,分布式数据库和分布式MapReduce解决方案也有如下缺点:[0005]1.由于是新技术,还没有统一的标准,那么,对于特定问题的处理需要用户进一步编程解决。不存在像关系数据库那么成熟的SQL标准。[0006]2.分布式数据库的管理不成熟,管理方面的人才缺乏。不像关系数据库的管理那么成熟,管理人才也多。[0007]3.继续使用关系数据库,对于客户来说,有着利旧方面的考虑。很多用户已经在关系数据库上投入了很大人力物力,希望能够将这些人力物力有效的利用起来,而目前全部转向分布式数据库和分布式MapReduce方案,则不利于利旧。[0008]4.很多项目,是在进行持续集成和持续交付,一开始,在数据量不是很多的时候,选择了关系数据库;随着用户业务的不断增大,数据量也不断增大。这时候考虑的大数据解决方案,仍然希望持续集成、平滑交付。直接换分布式数据库和分布式MapReduce方案,则存在巨大的升级交付风险。[0009]图2是Hadoop系统的MapReduce框架。MapReduce任务执行的一般流程是:[0010]1.Mapper任务从HDFS或其他分布式数据库上读取数据块(split)。[0011]2.每个Mapper任务调用map函数,对每一个数据块进行处理,处理的结果写入缓存或磁盘。[0012]3.Mapper执行完之后,数据在本地进行排序和合并(有可能经过本地的combine)。[0013]4.经过Shuffle阶段,每个节点把本地数据发送给对应的Reducer所在的节点。[0014]5.在Reducer本地进行排序和合并。[0015]6.Reducer处理本地的数据,并将结果写入HDFS。[0016]从上面的执行流程来看,MapReduce解决方案是一个全新的数据处理方案,在处理过程中,要么完全不用传统的关系数据库,要么用到也只是简单的从数据库里取出原始的数据,不能最大限度的利用SQL标准;其次,不管是MapReduce工具Hadoop,还是分布式数据库hbase等,对于开发来说,都是全新的技术,有相当的学习曲线;最后,分布式数据库hbase对于用户来说,也是全新的技术,用户不像关系数据库那样,有成熟的维护机制和人员。【
发明内容】[0017]本发明的目的是在使用传统关系数据库做分库分表来存储大数据的基础上,利用算法将查询Map到每一个分库和分表,然后利用关系数据库的强大SQL功能查询出每一个分库和每一个分表的结果,最后利用高级语言的聚合计算技术,把分库分表结果聚合出一个最终结果。[0018]为了使得传统数据库能够存储大数据,利用关系数据库的分库分表来存储大数据,本发明在Springtemplate技术的基础上,实现了分库分表的增删改查。[0019]为了实现分库分表后对全部的分库分表,或者部分的分库分表进行SQLmerge查询,本发明在利用强大的SQL查询的基础上,使用异步的、非阻塞的分库分表SQL查询,然后将所有的查询结果,使用高级语言的stream技术,聚合起来,形成最终结果。[0020]本发明提出了一种使用高级语言stream技术聚合分库分表的merge查询的方法,其步骤为:[0021](I)客户端通过代理服务子模块调用dao层方法来查询分库分表数据;[0022](2)代理服务子模块的处理单元ProxyHandler通过代理技术接收到查询请求,调用分库分表选择子模块,解析出本次查询涉及到的分库和分表,这种解析包括多个可扩展分库解析算法和多个可扩展的分表解析算法,默认实现了根据ID(机构ID或其他ID)的求余算法、根据月份的分库算法、根据日期的分表算法和根据ID(机构ID或其他ID)的求余算法;[0023](3)代理服务子模块的处理单元ProxyHandler根据分库和分表结果,利用Java高级语言的异步并发特性CompletableFuture,去调用实际的dao类对象并发查询所有的分库和分表;[0024](4)所有的分库和分表,都调用dao类对象方法,在调用该dao类方法的过程中,通过AOP技术触发调用了分库分表子模块,通过AOP技术实现的拦截器去拦截该方法,以获取步骤2中所得到的分库分表参数。[0025](5)分库分表子模块的拦截器获取到分库分表参数以后,通过ThreadLocal技术保存分库键值和分表键值,ThreadLocal技术是一个线程安全的数据存储技术,保证每一个调用dao类方法的线程,都有自己的分库键值和分表键值。[0026](6)分库分表子模块的拦截器最后真正调dao类对象方法,dao类方法是通过springjdbctemplate技术实现的,springjdbctemplate从ThreadLocal对象里获取到该分库键值和分表键值精确定位分库分表,获取查询结果。[0027](7)代理服务子模块调用分库分表查询结果并发聚合子模块将所有的CompletableFuture压入到Stream中,使用并发的stream聚合技术,将所有分库分表查询结果聚合,获取最终的查询结果;[0028](8)代理服务子模块将最终结果返回给客户端;[0029](9)如果是分页查询,本发明在查询总记录数的时候,会将每个分表的查询记录数保存在缓存,在查询分页记录的时候,就根据每个分表的记录数确定该分页记录在哪个分表上,然后直接去该分表上查询结果;[0030](10)整个过程,客户端就像调用一个普通的dao方法一样,没有任何使用上的复杂度。[0031]所述框架既利用了关系数据库强大的SQL查询功能,又通过高级语言的聚合算法,将分散的查询结果聚合成最终结果。[0032]通过高效的算法,快速的确定本次查询所涉及到的分库和分表,然后通过异步的、非阻塞的算法去查询每一个分库和分表。[0033]然后,将查询结果汇聚到stream里,通过stream的并发reduce算法,迅速的获得最终结果。[0034]更进一步,分页的查询结果,通过在查询总记录数的时候,保存到缓存的每个分表的记录数,来确定当前分页记录集需要查询哪个分表,快速的定位和查询分页结果。[0035]更进一步,每个分页的记录数保存在本地缓存中,缓存控制着数据的清除管理,从而保证了缓存不会因为数据过多而造成内存泄漏。[0036]更进一步,在计算基于时间的分表算法中,使用了Java8的LocalDate技术,能够快速的确定分表。[0037]更进一步,分库的键值是通过ThreadLocal保存在内存中,从而保证了并发的dao层访问的分库键值的安全性。[0038]更进一步,通过annotat1n技术来确定是做分表查询,还是做merge查询,同时查询的有几个并列的分表。[0039]本发明的有益效果:[0040]1.利用了传统的、稳定的关系数据库技术,有利于客户的利旧和维护,有利于降低开发人员技术要求。[0041]2.利用了关系数据库强大的SQL标准,既通过分库分表解决了关系数据库存储大数据的问题,又利用SQL标准强大的计算能力。[0042]3.本发明引入了Java8的CompletableFuture技术和stream技术,它们都是异步的、非阻塞的技术,最后完成分库分表的关系数据库分布式结果的聚合工作。[0043]综上所述,本发明首先通过扩展Springtemplate技术来解决关系数据库分库分表的问题。利用ThreadLocal来保证并发访问的分库键值的安全性。其次,本发明利用CompletableFuture技术来异步的、非阻塞的查询各分库和分表;最后,本发明使用stream技术来聚合所有的查询结果,形成最终结果返回给客户端。既利用了传统关系数据的强大数据分析能力,又使用了最新的stream技术将中间结果reduce成最终结果。既保留了传统关系数据库的稳定性和强大的功能,又给传统数据库扩展了最新的MapReduce技术。【附图说明】[0044]图1为分布式的MapReduce技术Hadoop的系统架构图;[0045]图2为本发明基于AOP的关系数据库分库分表单表操作方法系统架构图;[0046]图3为本发明基于stream的关系数据库分库分表SQLmerge查询方法系统架构图;[0047]图4为本发明基于stream的关系数据库分库分表SQLmerge查询方法流程图。【具体实施方式】[0048]下面详细说明本发明的实现步骤和具体方法。[0049]本发明的实现是基于传统关系数据库的分库分表和高级语言stream聚合技术的一套MapReduce方法。通过对传统数据库通过分库分表来存储大数据,又通过高级语言stream聚合技术来解决传统分库分表不能做MapReduce功能的缺陷。[0050]下面首先给出整个基于高级语言聚合计算的分库分表merge查询的架构图,说明整个工作流程和主要的模块任务,最后分表描述每个模块的具体实现。[0051]本发明的系统架构图如图2和图3所示。由于本发明的最终目的是构建一个基于高级语言聚合计算的分库分表MapReduceSQL查询框架,因此系统架构图包含了一个最基本的分库分表基础算法,它用来确定一个具体的分库及具体的分表,而多个分库分表的查询则是对一个具体的分库及具体的分表的多次并发调用得到的。要想得到多个分库分表,就必须根据输入条件,使用高效的算法来计算分库和分表的键值。根据键值和库名和表当前第1页1 2 
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1