CN112667744B - 一种数据库中数据批量同步更新的方法和装置 - Google Patents
一种数据库中数据批量同步更新的方法和装置 Download PDFInfo
- Publication number
- CN112667744B CN112667744B CN202011576026.2A CN202011576026A CN112667744B CN 112667744 B CN112667744 B CN 112667744B CN 202011576026 A CN202011576026 A CN 202011576026A CN 112667744 B CN112667744 B CN 112667744B
- Authority
- CN
- China
- Prior art keywords
- update
- column
- updating
- source
- columns
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及数据库领域,特别是涉及一种数据库中数据批量同步更新的方法和装置。主要包括:获取源端数据库中需要同步的源更新操作;获取每个源更新操作中的条件列信息集合和更新列信息集合;根据所有源更新操作的条件列信息集合和更新列信息集合,生成用于同步的目的更新语句;按照条件列信息集合中条件列的值和更新列信息集合中更新列的值,为目的更新语句的条件列和更新列生成绑定数据行;将目的更新语句作为目的更新操作提交至目的端数据库,使用绑定数据行中的值批量更新目的数据库。本发明可以使目前无法使用批量绑定数据行的多条源更新操作实现批量绑定数据行,并使用批量绑定数据行的方式完成数据同步,达到降低同步延迟的效果。
Description
【技术领域】
本发明涉及数据库领域,特别是涉及一种数据库中数据批量同步更新的方法和装置。
【背景技术】
同步性能是数据库数据实时同步系统中的关键指标。在数据同步系统中,源端数据库的更新(update,简写为:UPD)操作,在同步到目的端数据库时,由于每条操作之间都可能存在等待的情况,因此经常出现同步延迟。为了降低同步延迟,可以将多条SQL语句合并为一条,再为合并后的SQL语句批量绑定多行数据,通过一条SQL语句完成多个UPD操作,去除不同操作之间的等待时间,以减少每条语句之间的延迟。
批量绑定数据行时,为了将多条SQL语句合并为一条,要求所有被合并的UPD操作的更新列及条件列的列名都相同,即使用的SQL语句相同。而在现实情况中,经常出现多个UPD语句的更新列不同的情况,此时,必须针对不同的更新列使用不同的SQL语句,导致同步软件无法进行UPD语句的合并,无法使用批量绑定数据行的方式提高同步效率。
鉴于此,如何克服现有技术所存在的缺陷,解决某些场景下无法使用批量绑定数据行的方式降低同步延迟的现象,是本技术领域待解决的问题。
【发明内容】
针对现有技术的以上缺陷或改进需求,本发明解决了由于需同步的源更新操作中更新列不同,导致的无法使用批量绑定数据行的方式进行数据同步的问题。
本发明实施例采用如下技术方案:
第一方面,本发明提供了一种数据库中数据批量同步更新的方法,具体为:获取源端数据库中需要同步的源更新操作;获取每个源更新操作中的条件列信息集合和更新列信息集合,条件列信息集合中包含相应的源更新操作中所有的条件列的列名和值,更新列信息集合中包含相应的源更新操作所有的更新列的列名和值;根据所有源更新操作的条件列信息集合和更新列信息集合,生成用于同步的目的更新语句;按照条件列信息集合中条件列的值和更新列信息集合中更新列的值,为目的更新语句的条件列和更新列生成绑定数据行;将目的更新语句作为目的更新操作提交至目的端数据库,使用绑定数据行中的值批量更新目的数据库。
优选的,获取每个源更新操作中的条件列信息集合和更新列信息集合时,还包括:判断源更新操作中各组列名相同的更新列和条件列的值是否一致;若值不一致,将更新列放入更新列信息集合中;若值一致,更新列值不放入更新列信息集合中。
优选的,若源更新操作的所有列名相同的更新列和条件列的值都一致,不执行该条源更新操作。
优选的,生成用于同步的目的更新语句,包括:获取所有源更新操作的条件列信息集合中的列,作为目的更新语句的条件列;根据所有源更新操作的更新列信息集合获取需要更新的更新列集合,将更新列集合中的所有列作为目的更新语句的更新列。
优选的,根据所有源更新操作的更新列信息集合获取需要更新的更新列集合,包括:依次获取每个源更新操作中的更新列信息集合中的列名,判断列名是否存在于更新列集合中;若列名不存在于更新列集合中,将列名放入更新列集合中。
优选的,为目的更新语句的条件列和更新列生成绑定数据行,包括:根据每个源更新操作的条件列信息集合和更新列信息集合,获取目的更新语句中每个更新列和条件列对应的列值,作为该源更新操作的绑定数据行中相应列的值。
优选的,获取目的更新语句中每个更新列和每个条件列的对应该源更新操作的列值时,包括:若目的更新语句的更新列中包含不存在于该源更新操作中的更新列,以该源更新操作中相同列名的条件列的值作为该更新列的值。
优选的,获取源端数据库中需要同步的源更新操作,包括:对源端数据库的数据操作按照事务号划分,每个事务以非更新操作结束,以一个事务中包含的所有连续更新操作为一次批量更新时需要同步的更新操作。
优选的,若一个事务中包含的所有连续更新操作数量大于预设最大操作数量,每次获取的需要同步的更新操作数量不大于预设最大操作数量
另一方面,本发明提供了一种数据库中数据批量同步更新的装置,具体为:包括至少一个处理器和存储器,至少一个处理器和存储器之间通过数据总线连接,存储器存储能被至少一个处理器执行的指令,指令在被处理器执行后,用于完成第一方面中的数据库中数据批量同步更新的方法。
与现有技术相比,本发明实施例的有益效果在于:通过需同步的源更新操作中更新列和条件列的收集和选择,将多个条件列和更新列不同的源更新操作整合为一条目的更新语句,以满足绑定批量数据行的要求。通过该方法,可以使目前无法使用批量绑定数据行的多条源更新操作实现批量绑定数据行,并使用批量绑定数据行的方式完成数据同步,达到降低同步延迟的效果。
【附图说明】
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍。显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种数据库中数据批量同步更新的方法流程图;
图2为本发明实施例提供的另一种数据库中数据批量同步更新的方法流程图;
图3为本发明实施例提供的另一种数据库中数据批量同步更新的方法流程图;
图4为本发明实施例提供的另一种数据库中数据批量同步更新的方法流程图;
图5为本发明实施例提供的一种数据库中数据批量同步更新的装置结构示意图。
【具体实施方式】
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
本发明是一种特定功能系统的体系结构,因此在具体实施例中主要说明各结构模组的功能逻辑关系,并不对具体软件和硬件实施方式做限定。
此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。下面就参考附图和实施例结合来详细说明本发明。
实施例1:
在数据库操作中,数据库的UPD操作对应的SQL语句为update语句,每执行一次该语句,会造成数据库中满足执行条件的一行或多行数据的改变。在进行数据库同步时,若源端数据库中执行了UPD操作,需要在目的数据库中对满足同一执行条件的一行或多行数据执行相同的数据更新,以保证目的数据库中的数据与源数据库一致。在提交数据库操作时,为了避免数据冲突,或由于其它数据库调度原因,并非每一条操作都会立即执行,这就造成了同步延迟。为了避免同步延迟,可以通过批量绑定数据行的方式,将多条update语句的参数绑定在一次UPD操作中,通过一次UPD操作的执行更新多行数据,从而避免多个操作间的延迟,减少数据库整体的同步延迟。
Update语句的结构中包括条件列和更新列,使用的参数为每个条件列和更新列的值。如SQL语句Update t1 set c5=1 Where c1=2,其中t1为表的名称,where前的c5为更新列名,1为更新列值;where后的c1为条件列名,2为条件列值。该语句表示:在名为t1的表中,找到所有c1列的值为2的行,并将这些行中c5列的值设置为1。对于上述SQL语句,还可以使用参数绑定的形式写为:Update t1 set c5=:p1 Where c1=:p2,再为参数p1绑定值2,为参数p2绑定值1。两个SQL语句的意义及执行效果都一致。对于前一种形式,每次执行都完全一致;对于后一种形式,可以为参数p1和参数p2批量绑定数据行,每执行一次该语句使用一行不同的数据,相当于将多条前一种形式的SQL语句合并为一条语句。
在目前的同步方法中,由于不包含本实施例提供的条件列信息和更新列信息合并步骤,必须在多条SQL语句中包含的所有条件列和更新列都相同,仅有取值不同的情况下,才能使用批量绑定数据行的方式将多个SQL语句合并为一条SQL语句。若不同的SQL语句中包含不同的条件列或包含不同的更新列,则无法合并为一条SQL语句。在本实施例中,通对不同SQL语句中的条件列和更新列进行收集与合并,使得条件列和更新列不同的SQL语句也可以合并为一个SQL语句,以便于使用批量绑定数据行的方式进行同步。
例如,在某个数据库中,更新操作对应的SQL语句如下:
(1)Update t1 set c1=1 Where c2=2;
(2)Update t1 set c1=1 Where c2=3;
(3)Update t1 set c3=4Where c4=5。
其中,(1)(2)语句的条件列的列名都为c1,更新列的列名都为c2,条件列的列值都为1,条件列的列名、更新列的列名和条件列的列值都一致,仅更新列的列值不同,(3)语句的条件列和更新列的列名和列值都和(1)(2)不一致。目前已有的数据库同步工具中,可以将如(1)(2)通过批量绑定数据行的方式进行合并,合并后SQL语句为:Update t1 set c1=:p1 Where c2=:p2。(1)语句对应的绑定数据行:p1=1,p2=2;(2)语句对应的绑定数据行:p1=1;p2=3。但目前已有的数据库同步工具无法将(3)语句与(1)(2)语句进行合并,必须对该语句对应的更新操作单独提交,可能由于多次提交造成较多的同步延迟。
本发明实施例提供的数据库中数据批量同步更新的方法可以实现条件列和更新列的列名和列值都不同的SQL语句的合并,如图1所示,具体步骤如下:
步骤101:获取源端数据库中需要同步的源更新操作。
在进行数据同步时,需要将源端数据库中的数据同步至目的端数据库中。在现有的数据库使用场合中,很多数据库中都保存有海量数据,若每次同步时都将源端数据库中的所有数据都写入目的端数据库中,需要消耗大量的IO资源和带宽资源,且耗时较长。因此,目前进行数据库同步时,通常使用增量同步的方式,仅将上一次同步的时间点至本次同步的时间点之间产生数据改变进行更新。在数据库操作中,源端数据库执行添加、删除和更新操作会造成数据库中的数据改变。因此,进行增量同步时,仅需在目的端数据中重复上一次同步的时间点至本次同步的时间点之间源端数据库进行的添加、删除和更新操作,就可以使目的端数据库产生同样的数据改变,完成数据同步。在本实施里提供的方法中,为了保证合并后仅产生一条SQL语句,同时保证操作执行顺序正确,因此仅将连续的更新操作进行合并。由于数据库中所有的操作都记录在数据库日志中,可以根据源端数据库日志中的操作记录,获取源端数据库上一次同步至本次同步之间的每组连续的更新操作,作为需要同步的源更新操作。在后续的步骤中,会将每组连续的更新操作合并为一个目的更新语句,该组连续的更新操作与合并后的目的更新语句执行完成后,在目的端数据库产生的数据变化与源端数据库的数据变化一致,在保证数据同步准确性的基础上,达到减少操作数量,降低同步延迟的效果。
在数据库的使用场景中,可以将一个或多个操作合并为一个事务。在获取需同步的源更新操作时,可以对源端数据库日志中的操作按照事务号划分,将连续的更新操作划分至一个事务之内,每个事务以非更新操作结束,以一个事务中包含的所有连续更新操作为一次批量更新时需要同步的更新操作。进行划分后,对一个事务内的所有连续更新操作可以进行合并,再一次性提交执行。通过划分事务,既可以方便的将连续的更新操作进行分组,也可以方便的利用现有数据库管理平台中对事务处理的各种优化提高处理效率。在某些场景中,连续的更新操作数量可能较大,若一次全部获取并合并,可能会导致合并过程耗时较长,合并后的SQL语句较为复杂,降低数据库同步的效率。因此,在本实施例的实际使用中,可以根据实际情况设置每次合并的预设最大操作数量,若一个事务中包含的所有连续更新操作数量大于预设最大操作数量,每次获取的需同步的源更新操作数量不大于预设最大操作数量,以保证合并和执行的效率。
步骤102:获取每个源更新操作中的条件列信息集合和更新列信息集合,条件列信息集合中包含相应的源更新操作中所有的条件列的列名和值,更新列信息集合中包含相应的源更新操作所有的更新列的列名和值。
步骤101中获取到的每组需同步的源更新操作中包含一个或多个连续的源更新操作,每个源更新操作对应一个Update语句,每个Update语句中包含一个或多个条件列信息,还包含了一个或多个更新列信息,每个条件列信息包含列名及该列的当前值,每个更新列信息包含列名及该列更新后的值。每组需要同步的源更新操作中,所有源更新操作包含的条件列信息的并集为条件列信息集合,所有源更新操作包含的更新列信息的并集为更新列信息集合。条件列信息集合中包含该组需要同步的源更新操作中,所有源更新操作包含的条件列的列名,以及每个条件列对应的列值。更新列信息集合中包含该组需要同步的源更新操作中,所有源更新操作包含的每个更新列的列名,以及每个更新列对应的列值。获取到条件列信息集合和更新列信息集合后,即可在后续步骤中使用其中的列名和列值进行源更新操作的合并。步骤103:根据所有源更新操作的条件列信息集合和更新列信息集合,生成用于同步的目的更新语句。
为了能够在同步时批量绑定数据行,要将每组需要同步的源更新操作对应的SQL语句合并为一个目的更新语句,将合并后的目的更新语句作为目的更新操作向目的端数据库中提交。为了保证每一个被更新的行中,所有条件列的列值都符合全部源更新操作中条件列的要求,所有更新列的列值都符合全部源更新操作中更新列的要求,需要在合并后的目的更新语句中包含所有源更新操作的条件列信息和更新列信息。相应的,合并后的SQL语句中的条件列需要包含所有源更新操作对应的SQL语句中条件列的信息,以及所有源更新操作对应的SQL语句中更新列的信息。在步骤102中,已将所有条件列信息都加入条件列信息集合中,所有更新列信息都加入更新列信息集合中,因此,可以使用条件列信息集合中的列名作为目的更新语句的条件列,使用更新列信息集合中的列名作为目的更新语句的更新列,生成目的更新操作对应的目的更新语句。本实施例的一般实施场景中,每一个源更新操作的条件列都会包含数据库表中的所有列,每一条源更新操作的条件列都相同,可以直接将任一条源更新操作的条件列作为目的更新操作的条件列;源更新操作的更新列仅包含本数据库行需要更新的列,而目的更新操作的更新列需要包含所有源更新操作的更新列,因此需要将所有更新列信息集合中的列的集合作为目的更新操作的更新列。在本实施例中,将源更新操作中的条件列列名和列值组织为条件列信息集合,将源更新操作中的更新列列名和列值组织为更新列信息集合,不仅便于获取目的更新操作中条件列和更新列的列值,也通过条件列信息集合获取到了数据库行中所有列的原值,不必在需要使用原值时再次向源端数据库提交查询操作,减少了访问数据库的资源消耗和访问延迟,提高了操作合并效率,降低操作合并导致的性能降低。步骤104:按照条件列信息集合中条件列的值和更新列信息集合中更新列的值,为目的更新操作的条件列和更新列生成绑定数据行
数据库执行SQL语句时,可以直接在SQL语句中直接写入对应的值,执行SQL语句时直接使用该值;也可以在赋值的位置使用参数代替具体值,并为所有参数绑定数据行,绑定数据行的每一行都包含SQL语句中所有参数的值,对于一个SQL语句可以使用多个绑定数据行为参数赋不同的值,在执行SQL语句时,每执行一次SQL语句使用一行绑定数据行中的值。参数和绑定数据行配合使用的情况下,可以为SQL语句中的每个参数绑定多个不同的数据,将一个带参数的SQL语句作为多个仅参数位置的赋值不同的SQL语句执行,实现一次更新操作提交中执行多行SQL语句、更新多行数据的效果,避免将仅有赋值不同的多条SQL语句作为多个更新操作多次提交造成的同步延迟。
在本实施例中,合并后的SQL语句会包含需同步的源更新操作中所有的更新列和所有的条件列,可以使用每个源更新操作对应的更新列信息集合和条件列信息集合中的列值为对应行的对应参数赋值。另一方面,目的更新操作中的更新列可能会由多个源更新操作的更新列合并而成,合并后的SQL语句中也可能会包含本条源更新操作中没有而是合并自其它源更新语句的条件列或更新列,为了保持数据的一致性,使得这些源更新操作中没有的更新列的值在更新前后应保持不变,每个绑定数据行中,对应源更新操作中没有的更新列的参数值为更新前该行的条件列的列值。在本实施例的一般实施场景中,源更新操作的条件列包含数据库表中所有列,而每一个条件列信息包含了该列的当前列值,因此,每一条源更新操作对应的条件列信息集合中都包含了该数据库行全列的原列值,而这些列值已在步骤102中被保存在条件列信息集合中。因此,获取到条件列信息集合后,可以在需要使用数据库表原列值时,直接通过条件列信息集合中的列值获取每个列名对应的原列值,而不需要再次访问数据库表。在某些特殊场景中,若某个源更新操作的条件列不包括全部列,在获取条件列信息集合时,根据数据库行的原列值获得全部列的列名和列值,写入条件列信息集合,避免后续使用时再次访问数据库,造成数据库性能损失。
步骤105:将目的更新语句作为目的更新操作提交至目的端数据库,使用绑定数据行中的值批量更新目的数据库。
经过步骤102-步骤104,将每组需要同步的多个源更新操作进行合并生成目的更新语句,并为更新语句对应的每个源更新操作对应的绑定数据行的参数生成合适的列值后,可以将源端数据库中需要同步的多个连续的源更新操作对应的语句,转换为目的端数据库中的一个目的更新语句,将该目的更新语句作为一个目的更新操作,向目的端数据库中进行一次操作提交。目的端数据库在执行目的更新语句时调用每条源更新操作对应的绑定数据行中的值,完成多行数据的批量更新,实现了减少操作提交次数和SQL语句数量,降低目的端数据库的同步延迟的效果。
在数据库的每次同步更新中,若存在连续的更新操作,可以对每一组连续的更新操作使用步骤101-步骤105的方法进行合并。
使用步骤101-步骤105所提供的数据批量同步更新的方法,可以在保证数据更新结果一致的情况下,简便有效的将目前无法合并的条件列和更新列不同的源更新操作合并为一个目的更新操作,扩展了批量绑定数据行的同步方式的适用范围,通过合并更多的SQL语句减少更新操作提交次数,降低数据库同步的同步延迟,提高数据库同步效率。
实施例2:
在本实施例的具体实施场景中,可以使用本实施例提供的具体步骤完成实施例1中提供的步骤101-步骤105,实现源更新操作的合并。
一个具体实施场景中,包含数据库表t1。如下表1所示为t1更新前的数据,表1中第1列为数据行的行号,第2列至第6列分别是列名为c1、c2、c3、c4、c5的列值。
102 | 1 | 2 | 3 | 4 | A |
103 | 1 | 2 | 3 | 4 | A |
104 | 1 | 2 | 3 | 4 | A |
表1
在两次数据库同步之间,源端数据库对表t1依次进行了如下三个连续更新操作。在具体实施场景中,可以将如下三个操作划分为一个事务进行处理,以便于使用数据库平台中事务相关的工具提高处理效率。
(A1)对102行执行:Update t1 set c5=bbb。
(A2)对103行执行:Update t1 set c1=2。
(A3)对104行执行:Update t1 set c1=1,c2=3。
上述源更新操作为连续的更新操作,且数量不超过预设最大操作数,因此可以全部合并为一个目的更新语句,根据步骤101,可以获取这三个操作,将这三个操作划分为一个事务,作为进行数据库同步时的一组需要同步的源更新操作。
在另一些具体实施场景中,两次数据库同步之间的连续的源更新操作数可能会超过预设最大操作数量,为了简便的统计获取到的源更新操作数并划分事务,可以将获取到的连续的源更新操作存放于操作列表中,判断操作列表中的操作数量是否大于预设最大操作数,若获取到的操作为非更新操作或操作列表中的操作数量大于预设最大操作数,则暂停获取源更新操作,将操作列表中已存在的源更新操作进行合并。具体步骤如图2所示。
步骤201:建立空操作列表,用于临时存放一组需同步的源更新操作。
步骤202:从源端数据库的日志中获取一个操作。
步骤203:判断操作是否为更新操作。若是,需进行合并,转步骤204;若否,表明不是连续的更新操作,停止获取操作,转步骤206。
步骤204:判断操作列表中的操作个数是否大于预设最大操作数。若否,表明还可以继续添加操作,转步骤205;若否,说明不能继续添加操作,转步骤206。
步骤205:将操作加入操作列表,转步骤202继续获取操作。
步骤206:以当前操作列表中的操作作为一组需同步的源更新操作,划分为一个事务,用于完成后续的合并。
经过步骤201-步骤206,即可简便准确的获取到一组需同步的源更新操作,以供后续步骤使用。
经A1、A2和A3三次更新操作后,t1各列的值如下表2所示,。
102 | 1 | 2 | 3 | 4 | bbb |
103 | 2 | 2 | 3 | 4 | A |
104 | 2 | 3 | 3 | 4 | A |
表2
根据步骤102,根据操作A1、A2和A3获得每个源更新操作对应的条件列信息和更新列信息:
(B1)102行:更新列c5=bbb,条件列c1=1、c2=2、c3=3、c4=4、c5=A。
(B2)103行:更新列c1=2,条件列c1=1、c2=2、c3=3、c4=4、c5=A。
(B3)104行:更新列c1=2、c2=3,条件列c1=1、c2=2、c3=3、c4=4、c5=A。
由于每个操作中更新列和条件列都不同,因此目前的数据同步工具中进行同步时,需要分别根据每个操作对应的条件列和更新列,为每个操作生成如下的SQL语句和对应的绑定数据行,并依次提交和执行:
(C1)Update t1 set c5=:p1 Where c1=:p2 Andc2=:p3 And c3=:p4 And c4=:p5 And c5=:p6;参数值分别为,p1=bbb,p2=1,p3=2,p4=3,p5=4,p6=A;
(C2)Update t1 set c1=:p1 Where c1=:p2 Andc2=:p3 And c3=:p4 And c4=:p5 And c5=:p6;参数值分别为,p1=2,p2=1,p3=2,p4=3,p5=4,p6=A;
(C3)Update t1 set c1=:p1,c2=:p2 Where c1=:p2 Andc2=:p3 And c3=:p4 And c4=:p5 And c5=:p7;参数值分别为,p1=2,p2=3,p3=1,p4=2,p5=4,p7=A。
在本实施例提供的数据批量同步更新的方法中,可以按照以下具体步骤将三个更新操作合并为一个目的更新语句。
根据更新操作信息B1、B2和B3,以及表1中更新前的列值,操作A1的条件列信息集合为{c1=1,c2=2,c3=3,c4=4,c5=A},操作A2的条件列信息集合为{c1=1、c2=2,c3=3,c4=4,c5=A},操作A3的条件列为{c1=1、c2=2、c3=3、c4=4、c5=A}。操作A1的更新列信息集合为{c5=bbb},操作A2的更新列信息集合为{c1=2},操作A3的更新列信息集合为{c1=2,c2=3}。
在某些数据库场景中,操作信息中可能会出现条件列和更新列重复的情况,因此在生成更新列信息集合时,需要判断源更新操作中各组列名相同的更新列和条件列的值是否一致;若值不一致,将更新列放入更新列信息集合中;若值一致,更新列值不放入更新列信息集合中。某条更新操作的条件列为c1=1、c2=2,更新列为c2=2、c3=3。在该场景下,更新前的c2列数据应为2,更新后的c2列数据也为2,数据不变,不需要更新该列数据,因此为了简化后续的合并操作步骤,c2=2不放入该操作的更新列信息集合中,该操作的更新列信息集合为{c3=3}。
进一步的,若源更新操作的每组列名相同的更新列和条件列的值都一致,不执行该条源更新操作。某条源更新操作的条件列为c1=1、c2=2,更新列为c1=1、c2=2。在该场景下,更新前的c1列数据应为1,c2列数据应为2;更新后的c1列数据也为1,c2列数据也为2,所有需要更新的列数据都不变,该行不需要更新。为了简化后续的合并操作步骤,直接将该条源更新操作忽略,不加入操作列表中。
根据步骤103,获取到所有操作的条件列信息集合和更新列信息集合后,相当于获得了该组需要同步的源更新操作中所有需要处理的条件列和更新列,以及各列在源更新操作中的值。因此,可以根据条件列信息集合和更新列信息集合,将该组中多条源更新操作合并为一条能够实现同样更新效果的目的SQL语句,并生成用于同步的目的更新操作。
为了保证所有源更新操作中的条件列所限制的条件都被满足,所有需要进行数据变化的更新列都产生应有的变化,目的更新操作对应的SQL语句中需要包含所有源更新操作中的更新列和条件列。因此,需要获取所有源更新操作的条件列信息集合中的列,作为目的更新语句的条件列;还需要根据所有源更新操作的更新列信息集合获取需要更新的更新列集合,将更新列集合中的所有列作为目的更新语句的更新列。
具体的,根据所有源更新操作的更新列信息集合获取需要更新的更新列集合时,可以依次获取每个源更新操作中的更新列信息集合中的列名,判断列名是否存在于更新列集合中,若列名不存在于更新列集合中,将列名放入更新列集合中,若列名已存在于更新列集合中,列名不放入更新列集合中。根据上述方式,操作A1的更新列信息集合为{c5=bbb},将列名c5放入更新列集合中,更新列集合为{c5};操作A2的更新列信息集合为{c1=2},c1不存在于当前更新列集合中,将c1放入更新列集合中,更新列集合为{c5,c1};操作A3的更新列信息集合为{c1=2,c2=3},c1在更新列集合中,c2不在更新列集合中,c1不放入更新列集合中,c2放入更新列集合中,更新列集合为{c5,c1,c2}。同样的,可以得到用于目的更新操作的条件列集合{c1,c2,c3,c4,c5}。
在具体实施场景中,如图3所示,可以使用以下步骤完成更新列集合的收集。
步骤301:获取一个操作的更新列信息集合和条件列信息集合。
步骤302:由操作的更新列信息集合中获取一个更新列的列名和列值。
步骤303:由操作的条件列信息集合中获取与步骤302中更新列相同列名的条件列的列值。
步骤304:判断步骤303中获取到的相同列名的更新列和条件列的列值是否相同。若否,表示该更新列需要更新,转步骤305;若是,表示该更新列不需要更新,转步骤302。
步骤305:判断更新列集合中是否包含更新列的列名。若否,说明该列名不存在于更新列集合中,转步骤306;若是,说明该列名已存在于更新列集合中,转步骤302。
步骤306:将更新列的列名加入更新列集合中。
步骤307:判断操作中是否还有未获取的更新列。若是,转步骤302,继续获取更新列;若否,转步骤308。
步骤308:判断是否还有未处理的源更新操作。若是,转步骤301,继续处理下一个源更新操作;若否,更新列集合收集完成。
经过步骤301-步骤308,可以方便的完成更新列集合的收集,得到目的更新操作中需要使用的更新列的列名。
在数据库同步的一般场景中,获取到的源更新操作条件列会包含表中的所有列,因此多个连续的源更新操作条件列一致,可以根据任意一条源更新操作的条件列信息集合获取目的更新操作的条件列集合。
根据得到的更新列集合和条件列集合,可以将操作A1、A2和A3对应的SQL语句合并为下述目的更新语句,目的更新语句的更新列为上述步骤中获得的更新列集合{c5,c1,c2},目的更新语句的条件列为上述步骤中获得的条件列集合{c1,c2,c3,c4,c5},更新列和条件列的参数名按顺序依次标号。
(D)Update t1 set c1=:p1,c2=:p2,c5=:p3 Where c1=:p4 Andc2=:p5 Andc3=:p6 And c4=:p7 And c5=:p8。
目的更新语句D中包含了源更新操作A1、A2和A3中所有的更新列和条件列,在依次根据绑定数据行的参数执行后,可以确保需要更新的数据行依次满足每一个源更新操作的条件列要求,也可以实现每一个源更新操作的数据更新结果。
根据步骤104,得到参数形式的SQL语句后,需要根据每个源更新操作的更新列信息集合和条件列信息集合,为每个更新列和条件列的参数绑定合适的数据行。目的更新操作中的更新列为所有源更新操作的更新列集合,目的更新操作中的条件列包含源更新操作中的所有条件列集合,即数据库表中所有列集合。因此,目的更新操作相对于每条源更新操作,不仅包含该条源更新操作本身的更新列,还包含其它更新操作中的更新列。为目的更新操作绑定数据行时,每一行绑定数据行都对应了一条源更新操作的参数值,对于包含在对应源更新操作中的更新列和条件列,获取目的更新语句中每个更新列和条件列对应的列值,作为该源更新操作的绑定数据行中相应列的值。
对于源更新操作A1、A2和A3,通过步骤301-步骤308获取到更新列集合{c5,c1,c2},通过源更新操作的更新列信息集合,获取到条件列集合{c1,c2,c3,c4,c5},对每个操作中已存在的更新列和条件列,根据每个操作对应的条件列信息和更新列信息中保存的列值,可以直接获得每个操作对应的部分参数绑定的数据如下。
(E1)更新列:p3=bbb;条件列:p4=1,p5=2,p6=3,p7=4,p8=A。
(E2)更新列:p1=2;条件列:p4=1,p5=2,p6=3,p7=4,p8=A。
(E3)更新列:p2=3;条件列:p4=1、p5=2、p6=3、p7=4、p8=A。
已获得的各参数绑定数据行如表3。
p1 | p2 | p3 | p4 | p5 | p6 | p7 | p8 |
bbb | 1 | 2 | 3 | 4 | A | ||
2 | 1 | 2 | 3 | 4 | A | ||
3 | 1 | 2 | 3 | 4 | A |
表3
由表3可见,由于部分源更新操作的更新列中未包含目的更新语句D中的所有更新列,因此直接根据源更新操作的更新列信息集合无法获得绑定数据行中全部参数的值,还需要进一步使用其它数据获得参数的对应值。对于不存在于源更新操作中的更新列,源更新操作进行前后的数据不发生变化,而条件列信息集合中保存的该列数据即为源更新操作进行前该列的数据。因此,若目的更新操作的更新列中包含不存在于该源更新操作中的更新列,可以使用该源更新操作中相同列名的条件列的值作为该更新列的值。根据条件列信息集合,E1中不包含的更新列为c1、c2,对应的条件列中的值分别为c1=1,c2=2;E2中不包含的更新列为c2、c5,对应的条件列中的值分别为c2=2,c5=A;E3中不包含的更新列为c1、c5,对应的条件列中的值分别为c1=1,c5=A。进一步的,若条件列信息集合中也不包含缺乏参数值的列,可以直接使用源数据库中对应行对应列的原始值作为该列的参数值。根据条件列值进一步获得参数值后,各参数绑定数据行如表4。
p1 | p2 | p3 | p4 | p5 | p6 | p7 | p8 |
1 | 2 | bbb | 1 | 2 | 3 | 4 | A |
2 | 2 | A | 1 | 2 | 3 | 4 | A |
1 | 3 | A | 1 | 2 | 3 | 4 | A |
表4
进一步的,在实际使用场景中,为了便于获取绑定数据行中各参数的对应值,可以在获取更新列信息集合时,即步骤103中,为操作列表中保存的每个操作按照操作列表中保存的顺序,即执行顺序,依次设置扩展标记,通过列扩展标记判断每个源更新操作的更新列是否包含了目的更新操作中所有的更新列。在实际使用中,列扩展标记可以简单的使用标志位来表示,列扩展标志使用的位数与预设最大操作数相同或更多,即列扩展标志使用的位数与操作列表中容纳的操作数相同或更多,每一位依次对应操作列表中的一个源更新操作,由于1个字节包含8位,所以位数可以设为(预设最大操作数/8)字节,若预设最大操作数不是8的整倍数,则字节数向上取整。
如图4所示,可以使用以下步骤完成列扩展标记中每个源更新操作对应位的赋值,以下步骤也可以结合入步骤301-步骤308中,同时获取更新列集合并为列扩展标志的每个位赋值。其中,若源更新操作的更新列信息集合中包含了全部更新列集合中的列名,列扩展标志对应该源更新操作的位设为0,表明仅需使用更新列信息集合中的列值即可完成绑定行数据的参数值设置,不需要使用条件列信息集合或原数据行中的列值;相对的,若源更新操作的更新列信息集合中未包含全部更新列集合中的列名,列扩展标志对应该源更新操作的位设为1。
步骤401:获取已处理的源更新操作的数量L,前L个源更新操作的更新列已加入更新列集合中。
步骤402:获取一个源更新操作的更新列个数n,即该源更新操作更新列信息集合中的更新列个数n。
步骤403:获取更新列集合中已有的更新列的个数m。
步骤404:获取当前源更新操作更新列信息集合中的一个更新列。
步骤405:判断更新列的列名是否存在于更新列集合中。若是,表示该更新列已存在于更新列集合中,转步骤404;若否,表示该更新列不存在于更新列集合中,转步骤406。
步骤406:将更新列的列名加入更新列集合中,重新计算更新列集合中的更新列数量m。
步骤407:将列扩展标志中前L位都赋值为1,表示当前正在处理的源更新操作之前的源更新操作中都缺少当前的更新列。
步骤408:判断当前源更新操作的更新列信息集合中所有的更新列是否都处理完成。若否,转步骤404,继续处理下一个;若是,转步骤409,完成处理。
步骤409:判断当前源更新操作的更新列信息集合中的更新列个数n和当前更新列集合中的更新列个数m是否相同。若相同,说明当前源更新操作的更新列信息集合中包含了全部更新列集合中的列名,转步骤410;若不同,说明当前源更新操作的更新列信息集合中包含了全部更新列集合中的列名,转步骤411。
步骤410:该源更新操作对应的列扩展标志位赋值为0。
步骤411:该源更新操作对应的列扩展标志位保持赋值为1。
步骤412:判断是否还有未处理的操作。若是,继续处理下一个操作,转步骤401;若否,列扩展标志赋值完成。
通过步骤401-步骤412,可以方便的记录操作列表中每个源更新操作的更新列信息集合是否包含了全部更新列集合中的列名。在绑定数据行时,对于列扩展标记为0的源更新操作,可以从源更新操作的更新列信息集合中直接获取绑定数据行中所有的更新列的列值;对于列扩展标记为1的源更新操作,除了由更新列信息集合中获取列值,还需要由条件列信息集合或原数据行获取列值。
为每个源更新操作生成对应的绑定数据行后,即可使用目的更新语句D和表4中的绑定数据行生成目的更新操作,向目的端数据库中一次性提交对应一组连续的源更新操作的目的更新操作,通过批量数据绑定的方式完成数据同步更新。
本实施例提供了基于实施例1的数据批量同步方法的更具体的实现方式,并针对实施例1中提供的数据批量同步方法在不同场景中的使用进行了扩展,进一步提高了实施例1中源更新操作合并为目的更新操作的效率和准确度,进而提升了数据批量同步的效率和准确度。
实施例3:
在上述实施例1至实施例2提供的数据库中数据批量同步更新的方法的基础上,本发明还提供了一种可用于实现上述方法的数据库中数据批量同步更新的装置,如图5所示,是本发明实施例的装置架构示意图。本实施例的数据库中数据批量同步更新的装置包括一个或多个处理器21以及存储器22。其中,图5中以一个处理器21为例。
处理器21和存储器22可以通过总线或者其他方式连接,图5中以通过总线连接为例。
存储器22作为一种数据库中数据批量同步更新方法非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块,如实施例1至实施例2中的数据库中数据批量同步更新的方法。处理器21通过运行存储在存储器22中的非易失性软件程序、指令以及模块,从而执行数据库中数据批量同步更新的装置的各种功能应用以及数据处理,即实现实施例1至实施例2的数据库中数据批量同步更新的方法。
存储器22可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,存储器22可选包括相对于处理器21远程设置的存储器,这些远程存储器可以通过网络连接至处理器21。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
程序指令/模块存储在存储器22中,当被一个或者多个处理器21执行时,执行上述实施例1至实施例2中的数据库中数据批量同步更新的方法,例如,执行以上描述的图1-图4所示的各个步骤。
本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(Read Only Memory,简写为:ROM)、随机存取存储器(Random AccessMemory,简写为:RAM)、磁盘或光盘等。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种数据库中数据批量同步更新的方法,其特征在于:
获取源端数据库中需要同步的源更新操作;
获取每个源更新操作中的条件列信息集合和更新列信息集合,条件列信息集合中包含相应的源更新操作中所有的条件列的列名和值,更新列信息集合中包含相应的源更新操作所有的更新列的列名和值;
根据所有源更新操作的条件列信息集合和更新列信息集合,生成用于同步的目的更新语句;
按照条件列信息集合中条件列的值和更新列信息集合中更新列的值,为目的更新语句的条件列和更新列生成绑定数据行;
将目的更新语句作为目的更新操作提交至目的端数据库,使用绑定数据行中的值批量更新目的数据库。
2.根据权利要求1所述的数据库中数据批量同步更新的方法,其特征在于,所述获取每个源更新操作中的条件列信息集合和更新列信息集合,还包括:
判断源更新操作中各组列名相同的更新列和条件列的值是否一致;
若值不一致,将更新列放入更新列信息集合中;
若值一致,更新列值不放入更新列信息集合中。
3.根据权利要求2所述的数据库中数据批量同步更新的方法,其特征在于,还包括:
若源更新操作的所有列名相同的更新列和条件列的值都一致,不执行该条源更新操作。
4.根据权利要求1所述的数据库中数据批量同步更新的方法,其特征在于,所述生成用于同步的目的更新语句,具体包括:
获取所有源更新操作的条件列信息集合中的列,作为目的更新语句的条件列;
根据所有源更新操作的更新列信息集合获取需要更新的更新列集合,将更新列集合中的所有列作为目的更新语句的更新列。
5.根据权利要求4所述的数据库中数据批量同步更新的方法,其特征在于,所述根据所有源更新操作的更新列信息集合获取需要更新的更新列集合,具体包括:
依次获取每个源更新操作中的更新列信息集合中的列名,判断列名是否存在于更新列集合中;
若列名不存在于更新列集合中,将列名放入更新列集合中。
6.根据权利要求1所述的数据库中数据批量同步更新的方法,其特征在于,所述为目的更新语句的条件列和更新列生成绑定数据行,具体包括:
根据每个源更新操作的条件列信息集合和更新列信息集合,获取目的更新语句中每个更新列和条件列对应的列值,作为该源更新操作的绑定数据行中相应列的值。
7.根据权利要求6所述的数据库中数据批量同步更新的方法,其特征在于,所述获取目的更新语句中每个更新列和条件列对应的列值,还包括:
若目的更新语句的更新列中包含不存在于该源更新操作中的更新列,以该源更新操作中相同列名的条件列的值作为该更新列的值。
8.根据权利要求1所述的数据库中数据批量同步更新的方法,其特征在于,所述获取源端数据库中需要同步的源更新操作,具体包括:
对源端数据库的数据操作按照事务号划分,每个事务以非更新操作结束,以一个事务中包含的所有连续更新操作为一次批量更新时需要同步的更新操作。
9.根据权利要求8所述的数据库中数据批量同步更新的方法,其特征在于,还包括:
若一个事务中包含的所有连续更新操作数量大于预设最大操作数量,每次获取的需要同步的更新操作数量不大于预设最大操作数量。
10.一种数据库中数据批量同步更新的装置,其特征在于:
包括至少一个处理器和存储器,所述至少一个处理器和存储器之间通过数据总线连接,所述存储器存储能被所述至少一个处理器执行的指令,所述指令在被所述处理器执行后,用于完成权利要求1-9中任一项所述的数据库中数据批量同步更新的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011576026.2A CN112667744B (zh) | 2020-12-28 | 2020-12-28 | 一种数据库中数据批量同步更新的方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011576026.2A CN112667744B (zh) | 2020-12-28 | 2020-12-28 | 一种数据库中数据批量同步更新的方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112667744A CN112667744A (zh) | 2021-04-16 |
CN112667744B true CN112667744B (zh) | 2022-05-13 |
Family
ID=75410220
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011576026.2A Active CN112667744B (zh) | 2020-12-28 | 2020-12-28 | 一种数据库中数据批量同步更新的方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112667744B (zh) |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106339274A (zh) * | 2015-07-14 | 2017-01-18 | 阿里巴巴集团控股有限公司 | 一种数据快照获取的方法及系统 |
CN111752910A (zh) * | 2020-06-24 | 2020-10-09 | 上海微盟企业发展有限公司 | 一种异构平台的数据同步方法、系统和相关装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140279871A1 (en) * | 2013-03-13 | 2014-09-18 | Marcelo Ochoa | System and method for providing near real time data synchronization |
-
2020
- 2020-12-28 CN CN202011576026.2A patent/CN112667744B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106339274A (zh) * | 2015-07-14 | 2017-01-18 | 阿里巴巴集团控股有限公司 | 一种数据快照获取的方法及系统 |
CN111752910A (zh) * | 2020-06-24 | 2020-10-09 | 上海微盟企业发展有限公司 | 一种异构平台的数据同步方法、系统和相关装置 |
Also Published As
Publication number | Publication date |
---|---|
CN112667744A (zh) | 2021-04-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9678969B2 (en) | Metadata updating method and apparatus based on columnar storage in distributed file system, and host | |
WO2021027956A1 (zh) | 一种基于区块链系统的交易处理方法及装置 | |
CN112286941B (zh) | 一种基于Binlog+HBase+Hive的大数据同步方法和装置 | |
CN108875077B (zh) | 数据库的列存储方法、装置、服务器及存储介质 | |
CN110597842A (zh) | 业务数据查询方法及系统 | |
CN111913986B (zh) | 一种查询优化方法及装置 | |
CN116108057B (zh) | 一种分布式数据库访问方法、装置、设备及存储介质 | |
CN112000649A (zh) | 一种基于map reduce的增量数据同步的方法和装置 | |
CN107239485A (zh) | 数据库操作方法、装置及系统 | |
CN107798111B (zh) | 一种分布式环境中大批量导出数据的方法 | |
CN104050297B (zh) | 一种查询事务分配方法及装置 | |
CN115617571A (zh) | 一种数据备份方法、装置、系统、设备及存储介质 | |
US20090248691A1 (en) | Interacting methods of data summarization | |
CN111639965A (zh) | 积分更新方法及装置 | |
AU2019241002B2 (en) | Transaction processing method and system, and server | |
CN114443015A (zh) | 一种基于数据库元数据的增删改查服务接口生成方法 | |
CN112667744B (zh) | 一种数据库中数据批量同步更新的方法和装置 | |
CN112667593A (zh) | 一种ETL流程执行hbase快速装载的方法与装置 | |
CN112783927A (zh) | 一种数据库查询方法及系统 | |
CN113468178B (zh) | 一种关联表的数据分区装载方法与装置 | |
CN110334096B (zh) | 一种对非分区表进行分区并行读取的方法及装置 | |
CN110515993B (zh) | 税务数据转换方法及系统 | |
CN112882843A (zh) | 一种英文枚举自动补全中文值的方法 | |
CN111737341B (zh) | 基于日志解析的插入操作同步优化方法和数据同步系统 | |
WO2024198010A1 (zh) | 一种面向列存数据库的并发控制方法及其装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |