一种基于行变更的面向大事务的分片执行方法和装置与流程

文档序号:20838825发布日期:2020-05-22 17:13阅读:224来源:国知局
一种基于行变更的面向大事务的分片执行方法和装置与流程

本公开涉及计算机技术领域,具体涉及一种基于行变更的面向大事务的分片执行方法和装置。



背景技术:

本部分的陈述仅仅是提供了与本公开相关的背景技术信息,不必然构成在先技术。

行变更,即数据库事务执行引起的数据行变化,一条行变更包括行所属用户、行所属表、变更类型(删除,新增或者更新)以及变更前后的行数据等。通过读取被同步数据库的所有行变更,然后将行变更转化为相应的sql语句在另一个数据库上执行的方式实现了两个数据库之间的数据同步;同时为了保证事务的完整性,选择一次性读入一个事务的所有行变更,然后将基于行变更转化得到的所有sql语句在一个事务中执行,最后一次性提交。

但当遇到大事务时,大事务即引起了大量的行变更的事务,例如一个事务更改了上千万或者上亿行数据,此时如果一次性读入所有行变更,运行环境需要有非常高的内存配置,但是通常情况下,运行环境没有那么高的内存配置,即使有条件配置那么高的内存,但是大事务发生的概率是非常小的,这种情况下就会造成资源的浪费。

如何在不修改运行环境的内存配置的前提下,基于行变更实现大事务的同步,同时保证事务的完整性是目前需要解决的问题。



技术实现要素:

为了解决上述问题,本公开提出了一种基于行变更的面向大事务的分片执行方法和装置,通过对大事务对象进行分片,解析成sql语句分片执行;并且行变更推送、事务推送、事务执行并行处理,保证行变更数据同步的实时性,提高同步效率。

为了实现上述目的,本公开采用如下技术方案:

第一方面,本公开提供一种基于行变更的面向大事务的分片执行方法,包括:

获取被同步数据库的行变更数据,将其转化为行变更对象推送到行变更队列中;

从行变更队列中提取行变更对象,将多条行变更对象转化为一条事务对象推送到事务队列;

对大事务对象进行分片,从事务队列中获取分片事务对象,将其解析成相应的sql语句在第二数据库中分片执行,第二数据库同步更新行变更数据。

作为可能的一些实现方式,所述将多条行变更对象转化为一条事务对象推送到事务队列包括:

初始化行变更列表,从行变更队列中提取行变更对象,存储到行变更列表中;

从行变更队列获取头部行变更对象,并将该行变更对象从行变更队列中删除,判断该行变更对象是否为空;

若该行变更对象为空,则将行变更列表中所有行变更对象组成一个事务对象,并推送到事务列表中,且事务对象占用内存大小设置为所包含所有行变更对象内存大小之和,清空行变更列表;

若该行变更数据不为空,将其添加到行变更列表中,返回继续操作从行变更队列中删除头部行变更对象,判断该行变更对象是否为空。

作为可能的一些实现方式,所述第二数据库同步更新行变更数据包括:

将大事务对象划多个分片事务对象,从事务队列中删除头部分片事务对象,判断该分片事务对象是否为空;

若为空,则结束;若不为空,将该分片事务对象中所有行变更转化为sql语句并在第二数据库中执行;

执行成功后,判断该分片事务对象是否是大事务对象的最后一个分片,若是,提交当前事务;否则,返回继续操作从事务队列中删除头部分片事务对象,判断该分片事务对象是否为空。

第二方面,本公开提供一种基于行变更的面向大事务的分片执行装置,包括:

行变更推送模块,其用于获取被同步数据库的行变更数据,将其转化为行变更对象推送到行变更队列中;

事务推送模块,其用于从行变更队列中提取行变更对象,将多条行变更对象转化为一条事务对象推送到事务队列;

事务执行模块,其用于对大事务对象进行分片,从事务队列中获取分片事务对象,将其解析成相应的sql语句在第二数据库中分片执行,第二数据库同步更新行变更数据。

第三方面,本公开提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现一种基于行变更的面向大事务的分片执行方法所述的步骤。

第四方面,本公开提供一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现一种基于行变更的面向大事务的分片执行方法所述的步骤。

与现有技术相比,本公开的有益效果为:

通过将大事务对象进行分片,对分片事务对象解析成sql语句并分片执行,降低对运行环境的内存配置要求,避免高内存的资源浪费;

对大事务对象分片处理,即保证了行变更数据同步的速度,同时也保证了事务对象的完整性;

行变更推送、事务推送、事务执行并行处理,同样保证行变更数据同步的实时性,提高同步效率。

附图说明

构成本公开的一部分的说明书附图用来提供对本公开的进一步理解,本公开的示意性实施例及其说明用于解释本公开,并不构成对本公开的不当限定。

图1是一种基于行变更的面向大事务的分片执行方法的流程示意图;

图2是一种基于行变更的面向大事务的分片执行装置的结构示意图;

图3为行变更推送模块的执行流程图;

图4为事务推送模块的执行流程图;

图5为事务执行模块的执行流程图。

具体实施方式:

下面结合附图与实施例对本公开做进一步说明。

应该指出,以下详细说明都是例示性的,旨在对本公开提供进一步的说明。除非另有指明,本文使用的所有技术和科学术语具有与本公开所属技术领域的普通技术人员通常理解的相同含义。

需要注意的是,这里所使用的术语仅是为了描述具体实施方式,而非意图限制根据本公开的示例性实施方式。如在这里所使用的,除非上下文另外明确指出,否则单数形式也意图包括复数形式,此外,还应当理解的是,当在本说明书中使用术语“包含”和/或“包括”时,其指明存在特征、步骤、操作、器件、组件和/或它们的组合。

实施例1

本公开提供一种基于行变更的面向大事务的分片执行方法,本实施例包括如下步骤:

s1:获取被同步数据库的行变更数据,将其转化为行变更对象推送到行变更队列中;

s2:从行变更队列中提取行变更对象,将多条行变更对象转化为一条事务对象推送到事务队列;

s3:对大事务对象进行分片,从事务队列中获取分片事务对象,将其解析成相应的sql语句在第二数据库中执行,第二数据库同步更新行变更数据。

如图2-5所示,图中的名词含义解释如下:

current_mem_size:运行环境中所有未执行的行变更内存占用总量;

max_mem_size:运行环境中允许存储的所有未执行行变更的内存占用量最大值,该值可根据具体的运行环境动态设定;

row:行变更对象,包括行变更所属用户、所属表、变更类型(insert、update、delete)以及变更前后的行数据;

transaction:事务对象,包括多个行变更对象数据,存在的意义是为了一次批量执行多个行变更。

步骤s1中包括:

s101:读取行变更数据到运行环境中,并设置未执行的行变更内存占用总量;

对目前系统运行环境中读取的所有未被执行的行变更数据总的内存占用量的一个记录,读取行变更数据之后,这个值就变为原来的内存大小与读取的行变更数据的内存大小之和;

s102:将行变更数据转化为行变更对象推送到行变更队列中;

s103:比较未执行的行变更内存占用总量与预先设定的允许存储的未执行行变更的内存占用量最大值,若前者大于后者,继续执行步骤s103,直到后者大于前者返回步骤s101;

即,只要内存占用量不满足判断条件,就不往运行环境内存中读取行变更数据。

s104:否则,返回步骤s101。即,继续读取行变更数据,一次执行读取可能无法完全读取到所有的行变更数据,重新读取行变更数据,重新设置未执行的行变更内存占用总量。

步骤s2中包括:

s201:初始化行变更列表,从行变更队列中提取行变更对象,存储到行变更列表中;

s202:从行变更队列获取头部行变更对象,并将该行变更对象从行变更队列中删除,判断该行变更对象是否为空;

s203:若是,则比较未执行的行变更内存占用总量与预先设定的允许存储的未执行行变更的内存占用量最大值,

s203-1:若前者大于后者,则将行变更列表中所有行变更对象组成一个事务对象,并推送到事务列表中,且事务对象占用内存大小设置为所包含所有行变更对象内存大小之和,清空行变更列表;

s203-2:否则,返回步骤s202;

s204:若该行变更数据不为空,判断该行变更数据是否为大事务的最后一个行变更对象,

s204-1:若是,则将行变更列表中所有行变更对象组成一个事务对象,并推送到事务列表中,且事务对象占用内存大小设置为所包含所有行变更对象内存大小之和,清空行变更列表;

s204-2:否则,将其添加到行变更列表中,返回步骤s202。

步骤s3中包括:

s301:将大事务对象划多个分片事务对象,从事务队列中删除头部分片事务对象,判断该分片事务对象是否为空;

s302:若为空,则结束;若不为空,将该分片事务对象中所有行变更转化为sql语句并在第二数据库中执行;

s303:判断是否执行成功,若执行不成功,重新进行转化为sql语句;若执行成功,强制回收事务对象占用内存,设置未执行的行变更内存占用总量为原来的未执行的行变更内存占用总量与分片事务对象占用的内存大小之差;

s304:执行成功后,判断该分片事务对象是否是事务对象的最后一个分片,若是,提交当前事务;否则,返回步骤s301。

实施例2

本公开提供一种基于行变更的面向大事务的分片执行装置,包括行变更推送模块、事务推送模块和事务执行模块;

行变更推送模块、事务推送模块、事务执行模块是并行执行的。

行变更推送模块负责将行变更转化为row(行变更对象)推送到rowqueue(行变更队列);

rowqueue负责存储推送过来的行变更;

事务推送模块负责从rowqueue中获取row转化为transaction(事务对象)推送到transqueue(事务队列);

transqueue负责存储待执行的transaction;

事务执行模块负责从transqueue中获取transaction并解析成相应的sql语句执行。

实施例3

本公开提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现一种基于行变更的面向大事务的分片执行方法所述的步骤。

实施例4

本公开提供一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现一种基于行变更的面向大事务的分片执行方法所述的步骤。

本领域内的技术人员应明白,本公开的实施例可提供为方法、系统、或计算机程序产品。因此,本公开可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本公开可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本公开是参照根据本公开实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

以上仅为本公开的优选实施例而已,并不用于限制本公开,对于本领域的技术人员来说,本公开可以有各种更改和变化。凡在本公开的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本公开的保护范围之内。

上述虽然结合附图对本公开的具体实施方式进行了描述,但并非对本公开保护范围的限制,所属领域技术人员应该明白,在本公开的技术方案的基础上,本领域技术人员不需要付出创造性劳动即可做出的各种修改或变形仍在本公开的保护范围以内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1