数据读写批量处理方法、服务器及计算机可读存储介质与流程

专利2022-06-29  83


本发明涉及数据处理技术领域,尤其涉及一种数据读写批量处理方法、服务器及计算机可读存储介质。



背景技术:

目前,在涉及单数据库或多个数据库批量数据读写时,无法做完美处理。针对单数据库批量读写,目前大多数做法是处理模块先执行一个sql任务,等数据库处理返回后,再执行下一个sql任务。若其中读或写处理失败则返回给调用方。针对多数据库批量读写,目前的大多数做法是处理模块先确定第一个sql任务对应的数据表是在哪个数据库,再从该数据库中执行该sql任务,等数据返回后再确定第二个sql任务对应的数据表是在哪个数据库,以此类推,若其中一个sql任务执行失败则返回给调用方。

以上方式的缺陷在于,多个sql任务之间并无先后执行关系,但目前做法为方便简单处理进行顺序执行,耗时过长。并且,每多一类读写均需增加逻辑代码维护,增加人工成本。



技术实现要素:

有鉴于此,本发明提出一种数据读写批量处理方法、服务器及计算机可读存储介质,以解决至少一个上述技术问题。

首先,为实现上述目的,本发明提出一种数据读写批量处理方法,该方法包括步骤:

当从调用方接收到针对单数据库或多数据库的批量数据读写请求时,为每个读写请求分别分配唯一的请求id,所述读写请求中的请求参数包含数据库标识和读写任务,其中每个读写任务包括一个读写sql编号及需要执行的读写sql语句;

在hash内存中创建针对每个所述读写请求的存储结构,包括关键字和value结构,将所述请求id写入所述关键字中,并将每个所述读写请求对应的调用方的连接标示、以及所述读写请求中每个读写任务对应的读写sql语句及读写sql编号作为数组,写入所述value结构中;

根据每个所述读写请求中的数据库标识将所述读写请求的各个读写任务发送至对应的数据库并行处理;及

接收数据库返回的针对每个所述读写请求的各个读写任务的处理结果并更新至所述读写请求对应的所述value结构中。

可选地,该方法还包括步骤:

根据所述value结构,判断所述读写请求的读写任务是否已全部返回处理结果;

当所述读写请求的读写任务已全部返回处理结果时,组合所述读写请求的所有读写任务的处理结果并返回给调用方。

可选地,在所述根据每个所述读写请求中的数据库标识将所述读写请求的各个读写任务发送至对应的数据库并行处理的步骤中,发送给每个数据库的读写任务数据包含请求id、读写sql编号、读写sql语句。

可选地,所述处理结果包括请求id、读写sql编号、任务返回标识和任务返回数据。

可选地,所述value结构中还包括每个读写任务对应的任务返回标识和任务返回数据,所述接收数据库返回的针对所述读写请求的各个读写任务的处理结果并更新至所述读写请求对应的所述value结构中的步骤包括:

异步接收各个数据库返回的处理结果,根据每个处理结果中的请求id到hash内存中获取对应的value结构,再根据读写sql编号找出所述value结构中对应的读写任务,更新所述读写任务的任务返回标识和任务返回数据。

可选地,所述任务返回标识用于标示读写sql语句执行成功与否,返回数值0表示执行成功,非0表示执行失败。

可选地,所述任务返回数据用于标示读写sql语句对应的返回数据,当所述读写sql语句为查询任务且执行成功时,返回具体的查询结果数据;当所述读写sql语句为非查询任务或查询任务执行失败时,返回空值null。

可选地,该方法还包括步骤:

当所述读写请求的读写任务未全部返回处理结果而需要继续等待时,同时继续处理其他读写请求。

此外,为实现上述目的,本发明还提供一种服务器,包括存储器、处理器,所述存储器上存储有可在所述处理器上运行的数据读写批量处理系统,所述数据读写批量处理系统被所述处理器执行时实现如上述的数据读写批量处理方法的步骤。

进一步地,为实现上述目的,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质存储有数据读写批量处理系统,所述数据读写批量处理系统可被至少一个处理器执行,以使所述至少一个处理器执行如上述的数据读写批量处理方法的步骤。

相较于现有技术,本发明所提出的数据读写批量处理方法、服务器及计算机可读存储介质,可以提供统一的多数据库读写任务接口,当接收到批量数据读写请求后在hash内存中以每个读写请求唯一的请求id作为关键字,保存每个读写请求的各个读写任务对应信息,并将批量的读写任务同时发送至相应数据库进行并行处理,在接收到针对每个读写任务返回的处理结果时也写入hash内存中,使得多数据库的批量读写任务既可以并发处理,又不会产生数据混乱,访问耗时大大减少。

附图说明

图1是本发明各个实施例一可选的应用环境架构示意图;

图2是图1中的服务器一可选的硬件架构的示意图;

图3是本发明数据读写批量处理系统第一实施例的程序模块示意图;

图4是本发明在hash内存中创建的存储结构的示意图;

图5是本发明数据读写批量处理系统第二实施例的程序模块示意图;

图6是本发明数据读写批量处理方法第一实施例的流程示意图;

图7是本发明数据读写批量处理方法第二实施例的流程示意图;

本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

需要说明的是,在本发明中涉及“第一”、“第二”等的描述仅用于描述目的,而不能理解为指示或暗示其相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。另外,各个实施例之间的技术方案可以相互结合,但是必须是以本领域普通技术人员能够实现为基础,当技术方案的结合出现相互矛盾或无法实现时应当认为这种技术方案的结合不存在,也不在本发明要求的保护范围之内。

参阅图1所示,是本发明各个实施例一可选的应用环境架构示意图。

在本实施例中,本发明可应用于包括,但不仅限于,调用方1、服务器2、数据库3的应用环境中。其中,所述调用方1可以是移动电话、智能电话、笔记本电脑、数字广播接收器、pda(个人数字助理)、pad(平板电脑)、pmp(便携式多媒体播放器)、导航装置、车载装置等可移动设备,以及诸如数字tv、台式计算机、笔记本、服务器等固定终端。所述服务器2可以是机架式服务器、刀片式服务器、塔式服务器或机柜式服务器等计算设备,该服务器2可以是独立的服务器,也可以是多个服务器所组成的服务器集群。

所述服务器2通过网络(图中未示出)分别与一个或多个所述调用方1及所述数据库3通信连接,以进行数据传输和交互。所述网络可以是企业内部网(intranet)、互联网(internet)、全球移动通讯系统(globalsystemofmobilecommunication,gsm)、宽带码分多址(widebandcodedivisionmultipleaccess,wcdma)、4g网络、5g网络、蓝牙(bluetooth)、wi-fi、通话网络等无线或有线网络。

其中,每个所述数据库3对应一个数据库访问模块30,通过所述数据库访问模块30,可以接收并处理针对所述数据库3的读写请求,然后返回处理结果。

参阅图2所示,是本发明服务器2一可选的硬件架构的示意图。

本实施例中,所述服务器2可包括,但不仅限于,可通过系统总线相互通信连接存储器11、处理器12、网络接口13。需要指出的是,图2仅示出了具有组件11-13的服务器2,但是应理解的是,并不要求实施所有示出的组件,可以替代的实施更多或者更少的组件。

其中,所述服务器2可以是机架式服务器、刀片式服务器、塔式服务器或机柜式服务器等计算设备,该服务器2可以是独立的服务器,也可以是多个服务器所组成的服务器集群。

所述存储器11至少包括一种类型的可读存储介质,所述可读存储介质包括闪存、硬盘、多媒体卡、卡型存储器(例如,sd或dx存储器等)、随机访问存储器(ram)、静态随机访问存储器(sram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、可编程只读存储器(prom)、磁性存储器、磁盘、光盘等。在一些实施例中,所述存储器11可以是所述服务器2的内部存储单元,例如该服务器2的硬盘或内存。在另一些实施例中,所述存储器11也可以是所述服务器2的外部存储设备,例如该服务器2上配备的插接式硬盘,智能存储卡(smartmediacard,smc),安全数字(securedigital,sd)卡,闪存卡(flashcard)等。当然,所述存储器11还可以既包括所述服务器2的内部存储单元也包括其外部存储设备。本实施例中,所述存储器11通常用于存储安装于所述服务器2的操作系统和各类应用软件,例如数据读写批量处理系统200的程序代码等。此外,所述存储器11还可以用于暂时地存储已经输出或者将要输出的各类数据。

所述处理器12在一些实施例中可以是中央处理器(centralprocessingunit,cpu)、控制器、微控制器、微处理器、或其他数据处理芯片。该处理器12通常用于控制所述服务器2的总体操作。本实施例中,所述处理器12用于运行所述存储器11中存储的程序代码或者处理数据,例如运行所述的数据读写批量处理系统200等。

所述网络接口13可包括无线网络接口或有线网络接口,该网络接口13通常用于在所述服务器2与其他电子设备之间建立通信连接。

至此,己经详细介绍了本发明的应用环境架构及相关设备的硬件结构和功能。下面,将基于上述介绍提出本发明的各个实施例。

首先,本发明提出一种数据读写批量处理系统200。

参阅图3所示,是本发明数据读写批量处理系统200第一实施例的程序模块图。

本实施例中,所述数据读写批量处理系统200包括一系列的存储于存储器11上的计算机程序指令,当该计算机程序指令被处理器12执行时,可以实现本发明各实施例的数据读写批量处理操作。在一些实施例中,基于该计算机程序指令各部分所实现的特定的操作,数据读写批量处理系统200可以被划分为一个或多个模块。例如,在图3中,所述数据读写批量处理系统200可以被分割成分配模块201、保存模块202、发送模块203、更新模块204。其中:

所述分配模块201,用于为接收到的每个读写请求分配唯一的请求id。

具体地,调用方1采用json格式向服务器2发起针对单个数据库3或多个数据库3的批量数据读写请求。所述读写请求中包含数据库标识(db_id)、读写sql编号(sql_id,同一笔请求中sql_id不能相同)及需要执行的sql语句等请求参数。其中数据库标识用来标示数据库访问模块30,如a表示是通过数据库访问模块a访问数据库a。每个读写sql编号及对应的sql语句表示一个读写任务。每个读写请求可能包括一个或多个数据库标识和读写任务。所述分配模块201接收所述读写请求,并为每个所述读写请求分配唯一的请求id,即request_id。

针对单个数据库3的批量数据读写请求,例如一个数据库中有学生表(stu)、老师表(teac)、学生成绩表(stu_score),现在接收到一个针对该数据库的批量数据读写请求,需同时查询学生表中“小王”的数据(sql1:select*fromstuwherestu_name=’小王’)、查询老师表中“张老师”的数据(sql2:select*fromteacwhereteac_name=’张老师’)、更新学生成绩表中“小李”的数据(sql3:updatestu_scoresetscore=90wherestu_name=’小李’)。所述分配模块201可以为该读写请求分配一个唯一的请求id,例如178652986。

针对多个数据库3的批量数据读写请求,例如有数据库a包含学生表(stu)、老师表(teac),数据库b包含学生成绩表(stu_score),现在接收到一个针对数据库a和b的批量数据读写请求,需同时查询数据库a的学生表中的“小张”的数据和老师表中的“张三”的数据(sql1:select*fromstuwherestu_name=’小张’;sql2:select*fromteacwhereteac_name=’张三’)、查询数据库b的学生成绩表中“小李”的数据及修改“小明”的数据(sql3:select*fromstu_scorewherestu_name=’小李’;sql4:updatestu_scoresetscore=90wherestu_name=’小明’)。同样地,所述分配模块201也可以为该读写请求分配一个唯一的请求id,例如178652987。

所述保存模块202,用于将所述读写请求写入hash内存。

具体地,在hash内存中创建针对每个所述读写请求的存储结构,每个所述存储结构包括关键字(key)和value结构。将所述读写请求写入hash内存,其中,请求id即request_id作为hash内存中所述读写请求对应的key,并且将所述读写请求对应的调用方连接标示tcpsocket、以及所述读写请求中每个读写任务对应的读写sql语句及读写sql_id作为数组,写入所述请求id对应的value结构中。另外,该value结构的数组中还包含任务返回标识(sql_ret)和任务返回数据(sql_data)两项,用于后续写入针对所述读写请求返回的处理结果。参阅图4所示,为在hash内存中创建的所述存储结构的示意图。

例如,以上述两个读写请求的请求id作为key,将这两个读写请求的信息在hash内存中进行保存,并分别以这两个读写请求的调用方连接标示、读写sql语句及读写sql_id作为数组,写入各自的请求id对应的hash内存的value结构中。以上述针对数据库a和b的读写请求为例,在hash内存中以该读写请求的请求id“178652987”作为key,以调用方连接标示、读写sql语句(select*fromstuwherestu_name=’小张’;select*fromteacwhereteac_name=’张三’;select*fromstu_scorewherestu_name=’小李’;updatestu_scoresetscore=90wherestu_name=’小明’)及读写sql_id(sql1、sql2、sql3、sql4)作为数组,写入对应的value结构。

所述发送模块203,用于根据所述读写请求中的数据库标识将所述读写请求的各个读写任务发送至对应的数据库3并行处理。

具体地,获取所述读写请求中的请求参数,根据请求参数中的数据库标识即db_id,将属于不同数据库3(或者同一个数据库3)的多个数据读写任务同时发送到对应的数据库3。发送给每个数据库3的读写任务数据包含请求id(request_id)、任务id(task_id,与sql_id一致)、读写sql语句等。每个数据库3包含对应的数据库访问模块30,用于接收并处理该数据库3的读写请求,然后返回处理结果。返回的处理结果包含请求id(request_id)、任务id(task_id,与sql_id一致)、任务返回标识(sql_ret)、任务返回数据(sql_data)等。其中,任务返回标识用来标示sql语句执行成功与否,返回数值0表示执行成功,非0表示执行失败。任务返回数据用来标示sql语句对应的返回数据,当该sql语句为查询任务且执行成功时,返回具体的查询结果数据,当该sql语句为非查询任务时或查询执行失败时,返回空值null。

例如,上述数据库b针对查询学生成绩表中“小李”的数据(sql3:select*fromstu_scorewherestu_name=’小李’)这个查询任务,返回的处理结果中请求id为178652987,任务id为3,任务返回标识为0,任务返回数据为{“stu_name”:“小李”,“stu_score”:“95”};针对修改学生成绩表中“小明”的数据(sql4:updatestu_scoresetscore=90wherestu_name=’小明’)这个非查询任务,返回的处理结果中请求id为178652987,任务id为4,任务返回标识为0,任务返回数据为null。

在本实施例中,多个读写请求中的所有读写任务可以同时发送至对应数据库3中,所有子任务并行处理,耗时是其中一个最大子任务的耗时。

所述更新模块204,用于接收数据库3返回的处理结果并更新至所述读写请求对应的value结构中。

具体地,所述更新模块204异步接收各个数据库3返回的针对每个所述读写请求的各个读写任务的处理结果,根据每个处理结果中的请求id到hash内存中获取对应的value结构,再根据sql_id(与任务id一致)找出value结构中对应的读写任务,更新该读写任务的任务返回标识和任务返回数据。

例如,将上述数据库b返回的处理结果更新至hash内存中请求id“178652987”对应的value结构中。

本实施例提供的数据读写批量处理系统,可以提供统一的多数据库读写任务接口,当接收到批量数据读写请求后在hash内存中以每个读写请求唯一的请求id作为关键字,保存每个读写请求的各个读写任务对应信息,并将批量的读写任务同时发送至相应数据库进行并行处理,在接收到针对每个读写任务返回的处理结果时也写入hash内存中,使得多数据库的批量读写任务既可以并发处理,又不会产生数据混乱,访问耗时大大减少。

参阅图5所示,是本发明数据读写批量处理系统200第二实施例的程序模块图。本实施例中,所述的数据读写批量处理系统200除了包括第一实施例中的所述分配模块201、保存模块202、发送模块203、更新模块204之外,还包括判断模块205、返回模块206。

所述判断模块205,用于判断所述读写请求的读写任务是否已全部返回处理结果。

具体地,针对每个读写请求,判断对应value结构中的读写任务是否已全部返回处理结果。若未全部返回,则继续等待相应数据库3返回处理结果,直至该读写请求的读写任务全部返回处理结果。

值得注意的是,在本实施例中,当所述读写请求的读写任务未全部返回处理结果而需要继续等待时,可以同时继续处理其他读写请求,即其他读写请求不用排队等待,不会影响其他读写请求的处理时间。

所述返回模块206,用于当所述读写请求的读写任务已全部返回处理结果时,组合处理结果并返回给调用方1。

具体地,若所述读写请求的读写任务已经全部返回处理结果,则获取对应value结构中的调用方连接标示,并组合所述读写请求的所有读写任务的处理结果,将组合后的结果返回给调用方1。返回给调用方1的组合处理结果中包含数据库id(db_id)、读写sql_id、任务返回标识(sql_ret)、任务返回数据(sql_data)等数据。

例如,针对上述请求id为178652987的读写请求,判断对应value结构中的四个读写任务(sql1:select*fromstuwherestu_name=’小张’;sql2:select*fromteacwhereteac_name=’张三’;sql3:select*fromstu_scorewherestu_name=’小李’;sql4:updatestu_scoresetscore=90wherestu_name=’小明’)是否已全部返回,即这四个任务id对应的任务返回标识和任务返回数据是否已更新。若未全部返回,例如仅数据库b返回但数据库a还未返回,则继续等待数据库a返回的处理结果(此时可以同时处理其他读写请求)。若已全部返回,则将所有四个任务的处理结果组合起来,返回给调用方1。

值得注意的是,所述数据读写批量处理系统200的各个模块及各个数据库3的数据库访问模块30均可配置多个进程同步处理。本实施例是批量处理针对单个数据库3或多个数据库3的读写请求,可以同时处理多个不同的读写请求,即单个或多个数据库3的多个读请求与多个写请求可以混在一起批量并发处理。

本实施例提供的数据读写批量处理系统,可以提供统一的多数据库读写任务接口,对于批量的读写任务同时发送至相应数据库进行并行处理,并发能力高,访问耗时大大减少。调用方只需根据统一接口组装需要访问的数据库的读写任务列表,再根据统一接口返回的处理结果数据做逻辑处理即可,达到业务层与数据访问层抽象隔离的效果,提高生产效率。并且,本实施例的读写不依赖具体表,字段均是抽象获取,支持动态扩展表而不用修改代码,提高生产能力。另外,本实施例支持分布式部署和配置多进程处理,大大利用cpu多核硬件资源,提高处理能力。

此外,本发明还提出一种数据读写批量处理方法。

参阅图6所示,是本发明数据读写批量处理方法第一实施例的流程示意图。在本实施例中,根据不同的需求,图6所示的流程图中的步骤的执行顺序可以改变,某些步骤可以省略。

该方法包括以下步骤:

步骤s400,为接收到的每个读写请求分配唯一的请求id。

具体地,调用方1采用json格式向服务器2发起针对单个数据库3或多个数据库3的批量数据读写请求。所述读写请求中包含数据库标识(db_id)、读写sql编号(sql_id,同一笔请求中sql_id不能相同)及需要执行的sql语句等请求参数。其中数据库标识用来标示数据库访问模块30,如a表示是通过数据库访问模块a访问数据库a。每个读写sql编号及对应的sql语句表示一个读写任务。每个读写请求可能包括一个或多个数据库标识和读写任务。所述服务器2接收所述读写请求,并为每个所述读写请求分配唯一的请求id,即request_id。

针对单个数据库3的批量数据读写请求,例如一个数据库中有学生表(stu)、老师表(teac)、学生成绩表(stu_score),现在接收到一个针对该数据库的批量数据读写请求,需同时查询学生表中“小王”的数据(sql1:select*fromstuwherestu_name=’小王’)、查询老师表中“张老师”的数据(sql2:select*fromteacwhereteac_name=’张老师’)、更新学生成绩表中“小李”的数据(sql3:updatestu_scoresetscore=90wherestu_name=’小李’)。所述服务器2可以为该读写请求分配一个唯一的请求id,例如178652986。

针对多个数据库3的批量数据读写请求,例如有数据库a包含学生表(stu)、老师表(teac),数据库b包含学生成绩表(stu_score),现在接收到一个针对数据库a和b的批量数据读写请求,需同时查询数据库a的学生表中的“小张”的数据和老师表中的“张三”的数据(sql1:select*fromstuwherestu_name=’小张’;sql2:select*fromteacwhereteac_name=’张三’)、查询数据库b的学生成绩表中“小李”的数据及修改“小明”的数据(sql3:select*fromstu_scorewherestu_name=’小李’;sql4:updatestu_scoresetscore=90wherestu_name=’小明’)。同样地,所述服务器2也可以为该读写请求分配一个唯一的请求id,例如178652987。

步骤s402,将所述读写请求写入hash内存。

具体地,在hash内存中创建针对每个所述读写请求的存储结构,每个所述存储结构包括关键字(key)和value结构。将所述读写请求写入hash内存,其中,请求id即request_id作为hash内存中所述读写请求对应的key,并且将所述读写请求对应的调用方连接标示tcpsocket、以及所述读写请求中每个读写任务对应的读写sql语句及读写sql_id作为数组,写入所述请求id对应的value结构中。另外,该value结构的数组中还包含任务返回标识(sql_ret)和任务返回数据(sql_data)两项,用于后续写入针对所述读写请求返回的处理结果。

例如,以上述两个读写请求的请求id作为key,将这两个读写请求的信息在hash内存中进行保存,并分别以这两个读写请求的调用方连接标示、读写sql语句及读写sql_id作为数组,写入各自的请求id对应的hash内存的value结构中。以上述针对数据库a和b的读写请求为例,在hash内存中以该读写请求的请求id“178652987”作为key,以调用方连接标示、读写sql语句(select*fromstuwherestu_name=’小张’;select*fromteacwhereteac_name=’张三’;select*fromstu_scorewherestu_name=’小李’;updatestu_scoresetscore=90wherestu_name=’小明’)及读写sql_id(sql1、sql2、sql3、sql4)作为数组,写入对应的value结构。

步骤s404,根据所述读写请求中的数据库标识将所述读写请求的各个读写任务发送至对应的数据库3并行处理。

具体地,获取所述读写请求中的请求参数,根据请求参数中的数据库标识即db_id,将属于不同数据库3(或者同一个数据库3)的多个数据读写任务同时发送到对应的数据库3。发送给每个数据库3的读写任务数据包含请求id(request_id)、任务id(task_id,与sql_id一致)、读写sql语句等。每个数据库3包含对应的数据库访问模块30,用于接收并处理该数据库3的读写请求,然后返回处理结果。返回的处理结果包含请求id(request_id)、任务id(task_id,与sql_id一致)、任务返回标识(sql_ret)、任务返回数据(sql_data)等。其中,任务返回标识用来标示sql语句执行成功与否,返回数值0表示执行成功,非0表示执行失败。任务返回数据用来标示sql语句对应的返回数据,当该sql语句为查询任务且执行成功时,返回具体的查询结果数据,当该sql语句为非查询任务时或查询执行失败时,返回空值null。

例如,上述数据库b针对查询学生成绩表中“小李”的数据(sql3:select*fromstu_scorewherestu_name=’小李’)这个查询任务,返回的处理结果中请求id为178652987,任务id为3,任务返回标识为0,任务返回数据为{“stu_name”:“小李”,“stu_score”:“95”};针对修改学生成绩表中“小明”的数据(sql4:updatestu_scoresetscore=90wherestu_name=’小明’)这个非查询任务,返回的处理结果中请求id为178652987,任务id为4,任务返回标识为0,任务返回数据为null。

在本实施例中,多个读写请求中的所有读写任务可以同时发送至对应数据库3中,所有子任务并行处理,耗时是其中一个最大子任务的耗时。

步骤s406,接收数据库3返回的处理结果并更新至所述读写请求对应的value结构中。

具体地,所述服务器2异步接收各个数据库3返回的针对每个所述读写请求的各个读写任务的处理结果,根据每个处理结果中的请求id到hash内存中获取对应的value结构,再根据sql_id(与任务id一致)找出value结构中对应的读写任务,更新该读写任务的任务返回标识和任务返回数据。

例如,将上述数据库b返回的处理结果更新至hash内存中请求id“178652987”对应的value结构中。

本实施例提供的数据读写批量处理方法,可以提供统一的多数据库读写任务接口,当接收到批量数据读写请求后在hash内存中以每个读写请求唯一的请求id作为关键字,保存每个读写请求的各个读写任务对应信息,并将批量的读写任务同时发送至相应数据库进行并行处理,在接收到针对每个读写任务返回的处理结果时也写入hash内存中,使得多数据库的批量读写任务既可以并发处理,又不会产生数据混乱,访问耗时大大减少。

如图7所示,是本发明数据读写批量处理方法的第二实施例的流程示意图。本实施例中,所述数据读写批量处理方法的步骤s500-s506与第一实施例的步骤s400-s406相类似,区别在于该方法还包括步骤s508-s510。

该方法包括以下步骤:

步骤s500,为接收到的每个读写请求分配唯一的请求id。

具体地,调用方1采用json格式向服务器2发起针对单个数据库3或多个数据库3的批量数据读写请求。所述读写请求中包含数据库标识(db_id)、读写sql编号(sql_id,同一笔请求中sql_id不能相同)及需要执行的sql语句等请求参数。其中数据库标识用来标示数据库访问模块30,如a表示是通过数据库访问模块a访问数据库a。每个读写sql编号及对应的sql语句表示一个读写任务。每个读写请求可能包括一个或多个数据库标识和读写任务。所述服务器2接收所述读写请求,并为每个所述读写请求分配唯一的请求id,即request_id。

针对单个数据库3的批量数据读写请求,例如一个数据库中有学生表(stu)、老师表(teac)、学生成绩表(stu_score),现在接收到一个针对该数据库的批量数据读写请求,需同时查询学生表中“小王”的数据(sql1:select*fromstuwherestu_name=’小王’)、查询老师表中“张老师”的数据(sql2:select*fromteacwhereteac_name=’张老师’)、更新学生成绩表中“小李”的数据(sql3:updatestu_scoresetscore=90wherestu_name=’小李’)。所述服务器2可以为该读写请求分配一个唯一的请求id,例如178652986。

针对多个数据库3的批量数据读写请求,例如有数据库a包含学生表(stu)、老师表(teac),数据库b包含学生成绩表(stu_score),现在接收到一个针对数据库a和b的批量数据读写请求,需同时查询数据库a的学生表中的“小张”的数据和老师表中的“张三”的数据(sql1:select*fromstuwherestu_name=’小张’;sql2:select*fromteacwhereteac_name=’张三’)、查询数据库b的学生成绩表中“小李”的数据及修改“小明”的数据(sql3:select*fromstu_scorewherestu_name=’小李’;sql4:updatestu_scoresetscore=90wherestu_name=’小明’)。同样地,所述服务器2也可以为该读写请求分配一个唯一的请求id,例如178652987。

步骤s502,将所述读写请求写入hash内存。

具体地,在hash内存中创建针对每个所述读写请求的存储结构,每个所述存储结构包括关键字(key)和value结构。将所述读写请求写入hash内存,其中,请求id即request_id作为hash内存中所述读写请求对应的key,并且将所述读写请求对应的调用方连接标示tcpsocket、以及所述读写请求中每个读写任务对应的读写sql语句及读写sql_id作为数组,写入所述请求id对应的hash内存的value结构中。另外,该value结构的数组中还包含任务返回标识(sql_ret)和任务返回数据(sql_data)两项,用于后续写入针对所述读写请求返回的处理结果。

例如,以上述两个读写请求的请求id作为key,将这两个读写请求的信息在hash内存中进行保存,并分别以这两个读写请求的调用方连接标示、读写sql语句及读写sql_id作为数组,写入各自的请求id对应的hash内存的value结构中。以上述针对数据库a和b的读写请求为例,在hash内存中以该读写请求的请求id“178652987”作为key,以调用方连接标示、读写sql语句(select*fromstuwherestu_name=’小张’;select*fromteacwhereteac_name=’张三’;select*fromstu_scorewherestu_name=’小李’;updatestu_scoresetscore=90wherestu_name=’小明’)及读写sql_id(sql1、sql2、sql3、sql4)作为数组,写入对应的value结构。

步骤s504,根据所述读写请求中的数据库标识将所述读写请求的各个读写任务发送至对应的数据库3并行处理。

具体地,获取所述读写请求中的请求参数,根据请求参数中的数据库标识即db_id,将属于不同数据库3(或者同一个数据库3)的多个数据读写任务同时发送到对应的数据库3。发送给每个数据库3的读写任务数据包含请求id(request_id)、任务id(task_id,与sql_id一致)、读写sql语句等。每个数据库3包含对应的数据库访问模块30,用于接收并处理该数据库3的读写请求,然后返回处理结果。返回的处理结果包含请求id(request_id)、任务id(task_id,与sql_id一致)、任务返回标识(sql_ret)、任务返回数据(sql_data)等。其中,任务返回标识用来标示sql语句执行成功与否,返回数值0表示执行成功,非0表示执行失败。任务返回数据用来标示sql语句对应的返回数据,当该sql语句为查询任务且执行成功时,返回具体的查询结果数据,当该sql语句为非查询任务时或查询执行失败时,返回空值null。

例如,上述数据库b针对查询学生成绩表中“小李”的数据(sql3:select*fromstu_scorewherestu_name=’小李’)这个查询任务,返回的处理结果中请求id为178652987,任务id为3,任务返回标识为0,任务返回数据为{“stu_name”:“小李”,“stu_score”:“95”};针对修改学生成绩表中“小明”的数据(sql4:updatestu_scoresetscore=90wherestu_name=’小明’)这个非查询任务,返回的处理结果中请求id为178652987,任务id为4,任务返回标识为0,任务返回数据为null。

在本实施例中,多个读写请求中的所有读写任务可以同时发送至对应数据库3中,所有子任务并行处理,耗时是其中一个最大子任务的耗时。

步骤s506,接收数据库3返回的处理结果并更新至所述读写请求对应的value结构中。

具体地,所述服务器2异步接收各个数据库3返回的针对每个所述读写请求的各个读写任务的处理结果,根据每个处理结果中的请求id到hash内存中获取对应的value结构,再根据sql_id(与任务id一致)找出value结构中对应的读写任务,更新该读写任务的任务返回标识和任务返回数据。

例如,将上述数据库b返回的处理结果更新至hash内存中请求id“178652987”对应的value结构中。

步骤s508,判断所述读写请求的读写任务是否已全部返回处理结果。

具体地,针对每个读写请求,判断对应value结构中的读写任务是否已全部返回处理结果。若未全部返回,则继续等待相应数据库3返回处理结果,直至该读写请求的读写任务全部返回处理结果。

值得注意的是,在本实施例中,当所述读写请求的读写任务未全部返回处理结果而需要继续等待时,可以同时继续处理其他读写请求,即其他读写请求不用排队等待,不会影响其他读写请求的处理时间。

步骤s510,当所述读写请求的读写任务已全部返回处理结果时,组合处理结果并返回给调用方1。

具体地,若所述读写请求的读写任务已经全部返回处理结果,则获取对应value结构中的调用方连接标示,并组合所述读写请求的所有读写任务的处理结果,将组合后的结果返回给调用方1。返回给调用方1的组合处理结果中包含数据库id(db_id)、读写sql_id、任务返回标识(sql_ret)、任务返回数据(sql_data)等数据。

例如,针对上述请求id为178652987的读写请求,判断对应value结构中的四个读写任务(sql1:select*fromstuwherestu_name=’小张’;sql2:select*fromteacwhereteac_name=’张三’;sql3:select*fromstu_scorewherestu_name=’小李’;sql4:updatestu_scoresetscore=90wherestu_name=’小明’)是否已全部返回,即这四个任务id对应的任务返回标识和任务返回数据是否已更新。若未全部返回,例如仅数据库b返回但数据库a还未返回,则继续等待数据库a返回的处理结果(此时可以同时处理其他读写请求)。若已全部返回,则将所有四个任务的处理结果组合起来,返回给调用方1。

值得注意的是,所述数据读写批量处理方法的各个步骤及各个数据库3的数据库访问模块30均可配置多个进程同步处理。本实施例是批量处理针对单个数据库3或多个数据库3的读写请求,可以同时处理多个不同的读写请求,即单个或多个数据库3的多个读请求与多个写请求可以混在一起批量并发处理。

本实施例提供的数据读写批量处理方法,可以提供统一的多数据库读写任务接口,对于批量的读写任务同时发送至相应数据库进行并行处理,并发能力高,访问耗时大大减少。调用方只需根据统一接口组装需要访问的数据库的读写任务列表,再根据统一接口返回的处理结果数据做逻辑处理即可,达到业务层与数据访问层抽象隔离的效果,提高生产效率。并且,本实施例的读写不依赖具体表,字段均是抽象获取,支持动态扩展表而不用修改代码,提高生产能力。另外,本实施例支持分布式部署和配置多进程处理,大大利用cpu多核硬件资源,提高处理能力。

本发明还提供了另一种实施方式,即提供一种计算机可读存储介质,所述计算机可读存储介质存储有数据读写批量处理程序,所述数据读写批量处理程序可被至少一个处理器执行,以使所述至少一个处理器执行如上述的数据读写批量处理方法的步骤。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。

以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。


技术特征:

1.一种数据读写批量处理方法,其特征在于,所述方法包括步骤:

当从调用方接收到针对单数据库或多数据库的一个或多个批量数据读写请求时,为每个读写请求分别分配唯一的请求id,所述读写请求中的请求参数包含数据库标识和读写任务,其中每个读写任务包括一个读写sql编号及需要执行的读写sql语句;

在hash内存中创建针对每个所述读写请求的存储结构,包括关键字和value结构,将所述请求id写入所述关键字中,并将每个所述读写请求对应的调用方的连接标示、以及所述读写请求中每个读写任务对应的读写sql语句及读写sql编号作为数组,写入所述value结构中;

根据每个所述读写请求中的数据库标识将所述读写请求的各个读写任务发送至对应的数据库并行处理;及

接收数据库返回的针对每个所述读写请求的各个读写任务的处理结果并更新至每个所述读写请求对应的所述value结构中。

2.如权利要求1所述的数据读写批量处理方法,其特征在于,该方法还包括步骤:

根据所述value结构,判断所述读写请求的读写任务是否已全部返回处理结果;

当所述读写请求的读写任务已全部返回处理结果时,组合所述读写请求的所有读写任务的处理结果并返回给调用方。

3.如权利要求1或2所述的数据读写批量处理方法,其特征在于,在所述根据每个所述读写请求中的数据库标识将所述读写请求的各个读写任务发送至对应的数据库并行处理的步骤中,发送给每个数据库的读写任务数据包含请求id、读写sql编号、读写sql语句。

4.如权利要求1或2所述的数据读写批量处理方法,其特征在于,所述处理结果包括请求id、读写sql编号、任务返回标识和任务返回数据。

5.如权利要求4所述的数据读写批量处理方法,其特征在于,所述value结构中还包括每个读写任务对应的任务返回标识和任务返回数据,所述接收数据库返回的针对所述读写请求的各个读写任务的处理结果并更新至所述读写请求对应的所述value结构中的步骤包括:

异步接收各个数据库返回的处理结果,根据每个处理结果中的请求id到hash内存中获取对应的value结构,再根据读写sql编号找出所述value结构中对应的读写任务,更新所述读写任务的任务返回标识和任务返回数据。

6.如权利要求5所述的数据读写批量处理方法,其特征在于,所述任务返回标识用于标示读写sql语句执行成功与否,返回数值0表示执行成功,非0表示执行失败。

7.如权利要求5所述的数据读写批量处理方法,其特征在于,所述任务返回数据用于标示读写sql语句对应的返回数据,当所述读写sql语句为查询任务且执行成功时,返回具体的查询结果数据;当所述读写sql语句为非查询任务或查询任务执行失败时,返回空值null。

8.如权利要求2所述的数据读写批量处理方法,其特征在于,该方法还包括步骤:

当所述读写请求的读写任务未全部返回处理结果而需要继续等待时,同时继续处理其他读写请求。

9.一种服务器,其特征在于,所述服务器包括存储器、处理器,所述存储器上存储有可在所述处理器上运行的数据读写批量处理系统,所述数据读写批量处理系统被所述处理器执行时实现如权利要求1-8中任一项所述的数据读写批量处理方法的步骤。

10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有数据读写批量处理系统,所述数据读写批量处理系统可被至少一个处理器执行,以使所述至少一个处理器执行如权利要求1-8中任一项所述的数据读写批量处理方法的步骤。

技术总结
本发明涉及一种数据处理技术,揭露了一种数据读写批量处理方法,该方法包括:当从调用方接收到针对单数据库或多数据库的批量数据读写请求时,为每个读写请求分别分配唯一的请求ID;在hash内存中创建针对每个所述读写请求的存储结构,包括关键字和value结构,将请求ID写入关键字中,将调用方的连接标示、读写sql语句及读写sql编号写入value结构中;根据每个所述读写请求中的数据库标识将所述读写请求的各个读写任务发送至对应的数据库并行处理;接收数据库返回的处理结果并更新至所述读写请求对应的所述value结构中。本发明还提供一种服务器及计算机可读存储介质。本发明能够对批量读写任务进行并行处理,减少访问耗时。

技术研发人员:袁彪;张要伟
受保护的技术使用者:平安证券股份有限公司
技术研发日:2020.01.15
技术公布日:2020.06.09

转载请注明原文地址: https://bbs.8miu.com/read-25623.html

最新回复(0)