CN112559638B - 数据同步的方法、装置、设备和存储介质 - Google Patents
数据同步的方法、装置、设备和存储介质 Download PDFInfo
- Publication number
- CN112559638B CN112559638B CN202110191407.7A CN202110191407A CN112559638B CN 112559638 B CN112559638 B CN 112559638B CN 202110191407 A CN202110191407 A CN 202110191407A CN 112559638 B CN112559638 B CN 112559638B
- Authority
- CN
- China
- Prior art keywords
- database
- instruction
- data
- result
- context
- 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
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/27—Replication, distribution or synchronisation of data between databases or within a distributed database system; Distributed database system architectures therefor
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/546—Message passing systems or structures, e.g. queues
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/54—Indexing scheme relating to G06F9/54
- G06F2209/548—Queue
Abstract
本申请提供一种数据同步的方法、装置、设备和存储介质,该方法包括,接收业务端提供的数据库指令;解析数据库指令,以确定数据库指令的类型;若数据库指令的类型为数据操纵指令或者数据定义指令,在当前运行线程的线程上下文中设置捕获上下文;调用当前运行线程执行数据库指令;根据捕获上下文,保存数据库指令被执行后数据库的更新结果;将更新结果发送至数据库的消费端,使消费端基于更新结果实现数据同步。本方案直接捕获并向消费端发送数据库的更新结果,使得消费端在数据同步时不需要处理与更新结果无关的日志数据,提高了消费端数据同步的效率。
Description
技术领域
本发明涉及数据库技术领域,特别涉及一种数据同步的方法、装置、设备和存储介质。
背景技术
在业务端对一个数据库进行操作时,经常需要将对这个数据库的操作同步至这个数据库的消费端,这一过程称为数据同步,消费端可以是指需要使用该数据库的数据的程序,具体可以是其他数据库,也可以是其他的应用程序。
例如,对该数据库中添加或删除部分数据之后,消费端需要在本地添加或删除同样的数据,通过这种方式确保消费端使用的是该数据库最新的数据。
现有的一种数据库同步技术是,数据库定时将自身的重做日志(Redo Log)发送给数据库的消费端,Redo Log中包含数据库近期的所有操作记录,通过解析Redo Log并重复其中记录的操作(这一过程称为Redo Log的重放)。
但是,数据库常常会收到批处理指令(如删除或更新符合特定条件的一批数据的指令),数据库需要将批处理指令解析为对具体的操作指令,解析过程同样会记录在RedoLog,而消费端实现数据同步时并不需要重复该解析过程,因此现有技术中消费端需要浪费较多时间解析Redo Log,导致数据同步的效率较低。
发明内容
针对上述现有技术存在的缺点,本申请提供一种数据同步的方法、装置、设备和存储介质,以提供一种高效的数据同步方案。
本申请第一方面提供一种数据同步的方法,包括:
接收业务端发送的数据库指令;
解析所述数据库指令,得到所述数据库指令的类型;
若所述数据库指令的类型为数据操纵指令或者数据定义指令,在当前运行线程的线程上下文中设置捕获上下文;其中,所述数据操纵指令指代用于更新所述数据库的数据的指令;所述数据定义指令指代用于更新所述数据库的结构的指令;
调用所述当前运行线程执行所述数据库指令;
向所述业务端反馈所述数据库指令的执行结果,并根据所述当前运行线程的线程上下文中的捕获上下文,保存所述数据库指令被执行后所述数据库的更新结果;
响应所述业务端针对所述执行结果反馈的提交命令,将所述更新结果发送至所述数据库的消费端,使所述消费端基于所述更新结果实现数据同步。
可选的,所述保存所述数据库指令被执行后所述数据库的更新结果,包括:
若所述数据库指令属于数据操纵指令,保存所述数据库中被更新的数据;其中,所述被更新的数据由预先添加至所述数据库指令的返回指令反馈;
若所述数据库指令属于数据定义指令,保存所述数据库中被更新的结构。
可选的,所述在当前运行线程的线程上下文中设置捕获上下文之前,还包括:
若所述数据库指令属于数据操纵指令,判断目标数据是否属于预先指定的待同步数据表;其中,所述目标数据指代所述数据库指令所要更新的数据;
若所述目标数据属于所述待同步数据表,执行所述在当前运行线程的线程上下文中设置捕获上下文步骤;
若所述目标数据不属于所述待同步数据表,执行所述调用所述当前运行线程执行所述数据库指令步骤。
可选的,所述保存所述数据库指令被执行后所述数据库的更新结果,包括:
将所述数据库指令被执行后所述数据库的更新结果保存在数据暂存区;
其中,所述将所述更新结果发送至所述数据库的消费端,包括:
将所述数据暂存区所保存的所述更新结果写入消息队列,通过所述消息队列将所述更新结果发送至所述数据库的消费端。
可选的,所述向所述业务端反馈所述数据库指令的执行结果之后,还包括:
响应所述业务端针对所述执行结果反馈的回滚命令,删除已保存的所述更新结果。
可选的,所述解析所述数据库指令,得到所述数据库指令的类型之后,还包括:
若所述数据库指令的类型为数据查询指令或者数据控制指令,执行所述调用所述当前运行线程执行所述数据库指令步骤。
可选的,其特征在于,所述解析所述数据库指令,得到所述数据库指令的类型之前,还包括:
对所述数据库指令执行注入检测;
若所述数据库指令通过所述注入检测,执行所述解析所述数据库指令,得到所述数据库指令的类型步骤;
若所述数据库指令未通过所述注入检测,删除所述数据库指令,并向所述业务端反馈注入检测失败的提示信息。
本申请第二方面提供一种数据同步的装置,包括:
接收单元,用于接收业务端发送的数据库指令;
解析单元,用于解析所述数据库指令,得到所述数据库指令的类型;
设置单元,用于:若所述数据库指令的类型为数据操纵指令或者数据定义指令,在当前运行线程的线程上下文中设置捕获上下文;其中,所述数据操纵指令指代用于更新所述数据库的数据的指令;所述数据定义指令指代用于更新所述数据库的结构的指令;
执行单元,用于调用所述当前运行线程执行所述数据库指令;
反馈单元,用于向所述业务端反馈所述数据库指令的执行结果;
捕获单元,用于根据所述当前运行线程的线程上下文中的捕获上下文,保存所述数据库指令被执行后所述数据库的更新结果;
发送单元,用于响应所述业务端针对所述执行结果反馈的提交命令,将所述更新结果发送至所述数据库的消费端,使所述消费端基于所述更新结果实现数据同步。
可选的,所述捕获单元保存所述数据库指令被执行后所述数据库的更新结果时,具体用于:
若所述数据库指令属于数据操纵指令,保存所述数据库中被更新的数据;其中,所述被更新的数据由预先添加至所述数据库指令的返回指令反馈;
若所述数据库指令属于数据定义指令,保存所述数据库中被更新的结构。
可选的,所述装置还包括:
判断单元,用于若所述数据库指令属于数据操纵指令,判断目标数据是否属于预先指定的待同步数据表;其中,所述目标数据指代所述数据库指令所要更新的数据;
所述设置单元,用于若所述目标数据属于所述待同步数据表,执行所述在当前运行线程的线程上下文中设置捕获上下文步骤;
所述执行单元,用于若所述目标数据不属于所述待同步数据表,执行所述调用所述当前运行线程执行所述数据库指令步骤。
可选的,所述捕获单元保存所述数据库指令被执行后所述数据库的更新结果时,具体用于:
将所述数据库指令被执行后所述数据库的更新结果保存在数据暂存区;
其中,所述发送单元将所述更新结果发送至所述数据库的消费端时,具体用于:
将所述数据暂存区所保存的所述更新结果写入消息队列,通过所述消息队列将所述更新结果发送至所述数据库的消费端。
可选的,所述装置还包括:
删除单元,用于响应所述业务端针对所述执行结果反馈的回滚命令,删除已保存的所述更新结果。
可选的,所述执行单元还用于:
若所述数据库指令的类型为数据查询指令或者数据控制指令,执行所述调用所述当前运行线程执行所述数据库指令步骤。
可选的,所述装置还包括检测单元,用于:
对所述数据库指令执行注入检测;
若所述数据库指令通过所述注入检测,触发所述解析单元执行所述解析所述数据库指令,得到所述数据库指令的类型步骤;
若所述数据库指令未通过所述注入检测,删除所述数据库指令,并向所述业务端反馈注入检测失败的提示信息。
本申请第三方面提供一种电子设备,包括存储器和处理器;
其中,所述存储器用于存储计算机程序;
所述处理器用于执行所述计算机程序,具体用于实现本申请第一方面任意一项所提供的数据同步的方法。
本申请第四方面提供一种计算机存储介质,用于存储计算机程序,所述计算机程序被执行时,具体用于实现本申请第一方面任意一项所提供的数据同步的方法。
本申请提供一种数据同步的方法、装置、设备和存储介质,接收业务端提供的数据库指令;解析数据库指令,得到数据库指令的类型;若数据库指令的类型为数据操纵指令或者数据定义指令,在当前运行线程的线程上下文中设置捕获上下文;调用当前运行线程执行数据库指令;向业务端反馈数据库指令的执行结果,并且,根据捕获上下文,保存数据库的更新结果;其中,更新结果包括数据库指令更新后的数据或者结构;响应业务端针对执行结果反馈的提交命令,将更新结果发送至数据库的消费端,使消费端基于更新结果实现数据同步。本方案直接捕获并向消费端发送数据库的更新结果,使得消费端在数据同步时不需要处理与更新结果无关的日志数据,提高了消费端数据同步的效率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本申请实施例提供的一种数据同步的方法的流程图;
图2为本申请实施例提供的另一种数据同步的方法的流程图;
图3为本申请实施例提供的一种数据驱动程序的架构示意图;
图4为本申请实施例提供的一种数据同步的装置的结构示意图;
图5为本申请实施例提供的一种电子设备的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
数据同步,是指,对某一个数据库进行更新之后,需要同步地更新该数据库的各个消费端所保存的与该数据库相关的内容。
消费端可以是需要使用该数据库所保存的数据的应用程序,也可以是另一个数据库。
举例来说,假设有一个证券数据库,其中保存有市场上所有证券的属性信息,如标识,发行日期,价格等,这个证券数据库有两个消费端,第一个消费端为一个客户端程序,用于向用户展示市场上可供购买的证券,显然该客户端程序需要从证券数据库读取市场上多种证券的属性信息以便向用户展示,第二个消费端为一个理财产品数据库,用于记录各种理财产品,证券也属于一种理财产品,因此第二个消费端需要同步保存证券数据库中各证券的属性信息。
某一时刻,证券中心的管理程序可以向证券数据库发送数据库指令,以修改其中某一种或多种证券的属性信息,或者新增(或删除)某一种或多种证券,此时上述管理程序就相当于该证券数据库的业务端。
可以理解的,在上述数据库指令被执行,导致证券数据库被更新之后,上述第一消费端和第二消费端需要及时对本地所存储的对应数据进行更新,例如从证券数据库删除证券A后,第一消费端和第二消费端需要从本地记录的多种证券中同样的删除证券A,从而确保自身所用的数据为最新的数据。这一过程就称为对证券数据库的数据同步。
目前常用的数据同步方案有两种:
第一种方案一般适用于Oracle数据库,Oracle数据库的数据库驱动程序(用于解析和执行业务端提供的数据库指令)会在收到数据库指令后,将数据库指令的解析过程和执行过程全部记录在本地的重做日志(Redo Log),由此,数据库驱动程序可以在数据库被更新之后,将相应的Redo Log发送给消费端,使消费端解析Redo Log,并重复其中记录的数据库指令的解析过程,实现和数据库相同的更新过程。
如背景技术所述,Redo Log中记录数据库指令的解析过程的内容对于数据同步而言属于无用内容,而第一种同步方案需要解析完整的Redo Log,也就是需要浪费大部分时间来解析数据同步时不需要的内容,特别是当数据库指令为批处理指令时,解析过程对应的内容的数据量较大,严重降低了数据同步的效率。
第二种方案是,数据库驱动程序对数据库和数据库的每一个消费端均执行业务端提供的数据库指令,全部执行之后在向业务端反馈数据库指令的执行结果。这种方案的问题在于,一方面这种方案只有在数据库和消费端基于同一计算机技术框架开发时才适用,另一方面,原本数据库驱动程序只需要对数据库执行数据库指令即可反馈执行结果,应用这种方案则需要数据库驱动程序对数据库和若干个消费端执行数据库指令才能反馈执行结果,当有多条数据库指令需要执行时,这种方案显然会导致数据库的更新效率降低。
本申请实施例提供一种数据同步的方法,请参考图1,该方法可以包括如下步骤:
本申请任一实施例所提供的数据同步方法,可以由数据库驱动程序(下文简称驱动程序)执行。
S101、接收业务端发送的数据库指令。
业务端,可以是需要更新或者读取数据库的特定数据的应用程序,例如,若数据库是一个学生成绩数据库,业务端可以是教师电脑上的成绩录入客户端,教师可以在成绩录入客户端上输入新的考试成绩,然后业务端发送携带有新的考试成绩的数据库指令,以便将新的考试成绩写入学生成绩数据库,或者,教师可以在成绩录入客户端上输入特定的筛选条件,业务端向数据库发送携带该筛选条件的数据库指令,从而在数据库中读取中符合该筛选条件的若干个学生的成绩。
S102、解析数据库指令,得到数据库指令的类型。
本申请中,数据库指令的类型具体包括,数据操纵指令(又称为数据操纵语言,data manipulation language,DML),数据定义指令(又称为数据定义语言,datadefinition language),数据查询指令(又称为数据查询语言,Data Query Language,DQL),数据控制指令(又称为数据控制语言,Data Control Language,DCL)。
若解析出数据库指令的类型属于数据操纵指令,或者属于数据定义指令,则执行步骤S103,若解析出数据库指令的类型属于数据查询指令或者数据控制指令,则执行步骤S104。
数据查询指令,是指,用于从数据库中读取符合用户指定的筛选条件的数据的指令,这类指令一般以结构化查询语言(Structured Query Language,SQL)中定义的关键词SELECT作为开头,因此,可以通过识别数据库指令的第一个关键词是否为SELECT,来判断数据库指令是否输出数据查询指令。
例如,SELECT Name FROM Student就是一个简单的数据查询指令的例子,表示从学生(Student)表中读取姓名(Name)的数据。
数据控制指令,用来授予或回收访问数据库的特定权限,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等,数据控制指令一般包括FLUSH,GRANT等关键词,可以通过识别数据库指令中是否有这类关键词,来判断数据库指令是否为数据控制指令。
数据操纵指令,用于更新数据库中的数据,具体可以包括,删除数据库中的特定数据,在数据库中添加特定数据,以及修改数据库中部分数据的值等。其中,用于添加数据的数据操纵指令一般包括INSERT关键词,用于删除数据的数据操纵指令一般包括关键词DELETE,而修改数据的值的指令则会包括关键词UPDATE。
例如:
INSERT INTO T(ID,NAME,REMARK) VALUES(1,'zhangsan','remark1') 就是一条用于新增数据的数据操纵指令,表示在数据表T中新增一条记录,其中ID列的值为1,NAME列的值为'zhangsan',REMARK列的值为'remark1'。
数据定义指令,则一般用于更新数据库的结构,包括但不限于删除/新增数据表,或者在数据表中删除/新增字段(也就是删除/新增指定的列),数据定义指令中常见的关键词有CREATE,DROP,ALTER。
基于上述说明,可以理解的,步骤S102的具体实现方式可以是,识别业务端提供的数据库指令的关键词,判断其中的关键词属于前述哪一种指令所用的关键词,从而确定出当前的这条数据库指令属于哪一种指令。
S103、在当前运行线程的线程上下文中设置捕获上下文。
其中,若数据库指令属于数据定义指令,则步骤S103中只需要设置捕获上下文即可,若数据库指令属于数据操纵指令,则步骤S103中除了设置捕获上下文之外,还可以在数据库指令中添加返回指令,返回指令用于反馈数据库指令更新后的数据。
如当前这条数据操纵指令将数据库中的某个数据A从原本的值A1修改为A2,那么上述返回指令就用于反馈更新后的数据,也就是反馈A=A2,当添加了返回指令的数据操纵指令被执行后,执行数据操纵指令的程序就会输出更新后的数据,在本例子中,也就是输出上述A=A2。
在另一个例子中,数据库指令可以是前述:
INSERT INTO T(ID,NAME,REMARK) VALUES(1,'zhangsan','remark1') 。
如前文所述,这是一条数据操纵指令,向其中添加返回指令后,得到的新的数据库指令为:
INSERT INTO T(ID,NAME,REMARK) VALUES(1,'zhangsan','remark1')RETURNING ID,NAME,REMARK。
其中,RETURNING ID,NAME,REMARK就是步骤S103中添加的返回指令,上述新的数据库指令被执行后,执行的程序会返回更新后的数据,如:
T.ID=1;
T.NAME=zhangsan;
T.REMARK=remark1。
当前运行线程的线程上下文,具体可以包括当前运行线程运行所需的一些局部的环境参数,以及一些用于控制当前运行线程的功能的配置参数。
在本实施例中,捕获上下文可以理解为若干项用于控制当前运行线程捕获更新结果的参数,例如,捕获上下文可以包括,启用当前运行线程的捕获功能的参数,以及用于指定当前运行线程具体捕获哪些数据的参数,若设置了捕获上下文,则执行步骤S104时,当前运行线程就会在执行完数据库指令之后,根据捕获上下文所设定的参数,捕获并保存数据库指令的更新结果。
捕获上下文具体包含的参数可以根据实际情况调整,此处不做限定。
S104、调用当前运行线程执行数据库指令。
需要说明的是,若数据库指令不属于数据操纵指令,则其中为添加返回指令,相应的步骤S104所执行的,就是业务端发送过来的数据库指令,若数据库指令属于数据操纵指令,则步骤S104所执行的,就是添加了返回指令之后的数据库指令。
步骤S102至步骤S104所述的过程,相当于:
若收到的这条数据库指令属于数据查询指令或数据控制指令,则不做任何处理,直接调用当前运行线程执行该数据库指令;
如果收到的这条数据库指令属于数据操纵指令,则对这条数据库指令进行改写,也就是在其中添加返回指令,并且为当前运行线程设置捕获上下文,以便在数据库指令被执行后捕获更新结果,然后调用当前运行线程执行该数据库指令;
如果收到的这条数据库指令属于数据定义指令,则不对这条数据库指令做任何处理,并为当前运行线程设置捕获上下文,然后调用当前运行线程执行该数据库指令。
线程可以理解为计算机系统为了运行一个程序而分配的各种资源(如内存资源,处理器资源)的集合,步骤S104所述的当前运行线程,则指代用于运行直接对数据库进行操作的数据库引擎的线程。步骤S104,相当于,将收到的数据库指令作为输入参数提供给当前运行线程所运行的数据库引擎,使得数据库引擎执行这条数据库指令。
S105、向业务端反馈数据库指令的执行结果,并根据已设置的捕获上下文,保存数据库的更新结果。
步骤S105中反馈的执行结果,用于指示当前收到的这条数据库指令执行成功或者执行失败。
当数据库指令为数据操纵指令或者为数据定义指令时,数据库指令被执行后,数据库所保存的数据,或者数据库的结构会被更新,步骤S105中数据库的更新结果,就是数据库指令被执行后,数据库中被更新的结构或数据,具体可以包括:
若数据库指令属于数据操纵指令,则更新结果就是被数据库指令更新后的数据,具体可以参考步骤S103中所提供的例子;
若数据库指令属于数据定义指令,则更新结果就是数据库指令更新后的字段或数据表。
也就是说,若数据库指令属于数据操纵指令,保存数据库中被更新的数据;其中,被更新的数据由预先添加至数据库指令的返回指令反馈;
若数据库指令属于数据定义指令,保存数据库中被更新的结构(如新增或删除了哪些表,或哪些字段)。
例如,一条数据定义指令可以是:alter tname add score,该指令表示在数据表tname中添加一个新字段score,相应的,该指令被执行后,步骤S105中保存的更新结果可以是,数据表tname包含字段score。
S106、响应业务端针对执行结果反馈的提交命令,将更新结果发送至数据库的消费端。
消费端收到上述更细结果后,就可以基于更新结果实现数据同步。
例如,若更新结果包含数据操纵指令被执行后更新的数据,则消费端可以根据更新后的数据,同样的更新本地的数据。例如,更新结果可以是,数据库中的数据A的值从A1修改为A2,则消费端获得该更新结果后,若本地也保存有数据A,则消费端同样可以将本地的数据A的值修改为A2,从而实现消费端和数据库之间的数据同步。
本实施例所提供的数据同步的方法具有如下的有益效果:
第一方面,本实施例直接保存数据库指令被执行后的更新结果,并将更新结果提供给消费端,由此实现数据同步,因此,当数据库指令是需要进行解析的批处理指令,本实施例不会向消费端发送批处理指令的解析过程,相应的消费端在同步更新结果时,就不需要消耗时间来处理和批处理指令的解析过程相关的内容,因此显著缩短了完成数据同步所消耗的时间,提高数据同步的效率。
第二方面,数据库指令被执行后的更新结果,可以被任意一种计算机技术框架下的程序所识别,因此,利用本实施例提供的数据同步方法进行同步,可以允许数据库和消费端分别属于不同的计算机技术框架,换言之,本实施例提供的方法可以在不同技术框架的程序之间实现数据同步,而不会受到技术框架的限制。
第三方面,本实施例所提供的数据同步方法是在数据库指令被执行后并向业务端反馈了执行结果后,才保存本次的更新结果,因此,对于业务端而言,执行当前这条数据库指令所消耗的时间不会因为执行数据同步而延长,也就是说,本实施例提供的方法可以在不降低数据库指令原本的执行效率的前提下实现数据同步。
本申请另一实施例还提供一种数据同步的方法,请参考图2,该方法可以包括如下步骤:
S201、接收业务端发送的数据库指令。
S202、解析数据库指令,得到数据库指令的类型。
本申请中,数据库指令的类型具体包括,数据操纵指令(又称为数据操纵语言,data manipulation language,DML),数据定义指令(又称为数据定义语言,datadefinition language),数据查询指令(又称为数据查询语言,Data Query Language,DQL),数据控制指令(又称为数据控制语言,Data Control Language,DCL)。
若解析出数据库指令的类型为数据操纵指令,则执行步骤S203,若解析出数据库指令的类型为数据定义指令,则执行步骤S205,若解析出数据库指令的类型为数据查询指令或者数据控制指令,则执行步骤S206。
步骤S201和步骤S202的具体执行过程与前述步骤S101和步骤S102一致,不再详述。
S203、判断目标数据是否属于待同步数据表。
其中,目标数据指代数据库指令所要更新的数据。
例如,若数据库指令需要在数据表1中新增一项数据,则步骤S203,就相当于判断数据表1是否为待同步数据表,若数据库指令需要修改数据表2中的一项数据,则步骤S203就相当于判断数据表2是否为待同步数据表。
若目标数据属于待同步数据表,则执行步骤S204,反之,若目标数据不属于待同步数据表,则执行步骤S206。
待同步数据表,可以是预先指定的一个或多个需要进行数据同步的数据表,
可以立即的,数据库中可以包含多个数据表,而消费端可能只需要使用其中的一部分数据表,因此,若数据库指令涉及对其中消费端所使用的数据表的更新,则这些更新需要同步的消费端,反之,若数据库指令所更新的是消费端不使用的那些数据表,消费端就不需要同步这一更新。
综上所述,可以在数据库中预先将消费端所使用的那些数据表设定为待同步数据表,这样,如果是针对待同步数据表进行更新的数据库指令,则执行步骤S204,以便保存其更新结果,如果不是针对待同步数据表进行更新的数据库指令,则不需要保存其更新结果,也就不需要执行步骤S204,可以直接调用当前运行线程执行该数据库指令,这样可以避免保存不必要的更新结果,减少本实施例的数据同步方法所占用的存储空间。
S204、在数据库指令中添加返回指令,并设置捕获上下文。
步骤S204执行结束后,直接执行步骤S206。
S205、在当前运行线程的线程上下文中设置捕获上下文。
步骤S204和步骤S205,相当于前述实施例中的步骤S103。
S206、调用当前运行线程执行数据库指令。
S207、向业务端反馈数据库指令的执行结果,并根据已设置的捕获上下文,保存数据库的更新结果。
S209、识别业务端针对执行结果反馈的命令。
如图1所示的实施例,相当于业务端反馈提交命令时本申请的数据同步方法的执行过程,而在实际场景中,业务端所反馈的命令除了提交命令以外,还可以是回滚命令,或者可以是下一条数据库指令。
若业务端反馈的命令为提交命令,执行步骤S208;若业务端反馈的命令为回滚命令,执行步骤S211;若业务端反馈的命令是下一条数据库指令,则返回执行步骤S202。
S208、响应业务端针对执行结果反馈的提交命令,将更新结果发送至数据库的消费端。
S211、响应业务端针对执行结果反馈的回滚命令,删除已保存的更新结果。
也就是说,业务端可以连续的提交多条数据库指令,在这种情况下,本实施例所提供的数据同步方法,可以在每一条数据库指令均执行完毕之后,再将保存的所有更新结果一并发送给消费端。
可选的,在本申请的另一实施例中,在执行步骤S202之前,也就是在解析数据库指令,从而确定数据库指令的类型之前,还可以执行如下步骤:
对数据库指令执行注入检测;
若数据库指令通过注入检测,执行解析数据库指令,以确定数据库指令的类型;
若数据库指令未通过注入检测,删除数据库指令,并向业务端反馈注入检测失败的提示信息。
SQL注入攻击,是一种常见的针对数据库的攻击手段,其原理是,将SQL代码添加到数据库指令所包含的输入参数中(也就是将SQL代码注入到输入参数中),当数据库指令被数据库引擎执行时,输入参数中注入的SQL代码就会被执行,从而触发攻击行为,达到窃取或修改数据库中的数据的目的。
相应的,上述注入检测,就是检测收到的这条数据库指令的输入参数是否被注入SQL代码,若输入参数被注入了SQL代码,则确定这条数据库指令未通过注入检测,反之,若输入参数未被注入SQL代码,则确定这条数据库指令通过注入检测。
可选的,在本申请的任一实施例中,数据库指令的更新结果可以保存在驱动程序在相应存储介质中开辟的一块数据暂存区中,在需要将保存的更新结果发送给消费端时,可以采用多种发送方法,包括但不限于消息队列,数据报文等。
例如,驱动程序和消费端之间可以预先约定一个数据格式,需要发送更新结果时,驱动程序按约定的数据格式将更新结果封装为一个数据报文,然后将数据报文通过网络发送至消费端,由消费端再按约定的数据格式解析数据报文,即可得到其中的更新结果。
或者,驱动程序也可以通过消息队列发送更新结果。具体在,驱动程序可以在本地建立一个消息队列,同时向消费端提供该消息队列的读取接口,当需要发送更新结果时,驱动程序具体可以:
将数据暂存区所保存的更新结果写入消息队列,然后,消费端按一定的时间间隔实时扫描消息队列,当扫描到消息队列中存储有更新结果时,通过上述读取接口从消息队列中读取驱动程序写入的更新结果,由此,驱动程序就可以通过消息队列将更新结果发送至数据库的消费端。
本实施例在步骤S203中对数据库指令进行筛选,仅保存其中涉及待同步数据表的数据库指令的更新结果,而不保存不涉及待同步数据表的数据库指令的更新结果,从而减少本实施例所提供的方法所占用的存储空间。
进一步的,本实施例在解析数据库指令之间对数据库指令进行注入检测,从而避免解析那些被注入SQL代码的数据库指令,防止数据库受到注入攻击,提高数据库的安全性。
如前文所述,本申请所提供的数据同步方法可以由数据驱动程序执行,下面结合图3对本实施例的一种可选的数据驱动程序的架构,以及数据驱动程序和业务端,消费端之间的关系进行简要说明。
如图3所示,可以在现有的数据库驱动程序(也就是图3所示的语句执行模块)的基础上,增加一个自定义的代理层JDBC-Proxy,从而得到本实施例所提供的数据库驱动程序,也就是说,本申请所涉及的数据库驱动程序,包括图3所示的语句执行模块(即现有的数据库驱动程序,相当于前述数据库引擎),和代理层。JDBC-Proxy会代理现有的数据库驱动程序的所有接口(API),从而截获业务端向现有的数据库驱动程序所发送的所有数据库指令,并对截获的数据库指令执行本申请所提供的数据同步方法。
图3所示的数据库驱动程序的工作原理如下:
业务端通过数据访问层(data access object,DAO)向上述代理层发送数据库指令,DAO层在传递数据库指令时,可以执行前述注入检测的步骤,若通过注入检测,则将数据库指令传递至代理层,若未通过则删除数据库指令,不将其传递给代理层。
代理层接收数据库指令后,由图3所示的SQL解析模块解析数据库指令,得到数据库指令的类型,当其为数据操纵指令或数据定义指令时,数据库指令被传递至语句改写模块,由语句改写模块执行添加返回指令,设置捕获上下文等步骤,然后在传递至语句执行模块,当数据库指令不属于数据操纵指令,且不属于数据定义指令时,数据库指令则直接传递至由当前运行线程运行的语句执行模块。
语句执行模块执行了数据库指令后,一方面将执行结果(即执行成功或失败)反馈给业务端,另一方面,在设置了捕获上下文时,将更新结果保存在图3所述的数据暂存区中。
在业务端针对执行结果反馈了提交命令后,数据暂存区的更新结果保存至消息队列,随后消费端就可以从消息队列读取更新结果。
结合本申请任一实施例所提供的数据同步的方法,本申请实施例还提供一种数据同步的装置,请参考图4,该装置具体可以包括如下单元:
接收单元401,用于接收业务端发送的数据库指令。
解析单元402,用于解析数据库指令,得到数据库指令的类型。
设置单元403,用于若数据库指令的类型为数据操纵指令或者为数据定义指令,在当前运行线程的线程上下文中设置捕获上下文。
其中,数据操纵指令指代用于更新数据库的数据的指令;数据定义指令指代用于更新数据库的结构的指令。
执行单元404,用于调用当前运行线程执行数据库指令。
反馈单元405,用于向业务端反馈数据库指令的执行结果。
捕获单元406,用于根据当前运行线程的线程上下文中设置的捕获上下文,保存数据库的更新结果。
发送单元407,用于响应业务端针对执行结果反馈的提交命令,将更新结果发送至数据库的消费端,使消费端基于更新结果实现数据同步。
其中,业务端反馈的提交命令可以由前述接收单元401接收,当接收单元收到提交命令后,就可以触发发送单元407执行上述步骤。
可选的,捕获单元406保存数据库指令被执行后数据库的更新结果,包括:
若数据库指令属于数据操纵指令,保存数据库中被更新的数据;其中,被更新的数据由预先添加至数据库指令的返回指令反馈,具体的,返回指令可以在确定出数据库指令属于数据操纵指令之后,由设置单元403在设置捕获上下文的同时向数据库指令中添加。
若数据库指令属于数据定义指令,保存数据库中被更新的结构。
可选的,该装置还包括:
判断单元408,用于判断目标数据是否属于预先指定的待同步数据表;其中,目标数据指代数据库指令所要更新的数据;
设置单元403用于,若目标数据属于待同步数据表,执行在数据库指令中添加返回指令步骤;
执行单元404用于,若目标数据不属于待同步数据表,执行调用当前运行线程执行数据库指令步骤。
可选的,捕获单元406保存数据库指令的更新结果时,具体用于:
将数据库指令的更新结果保存在数据暂存区;
其中,发送单元407将更新结果发送至数据库的消费端时,具体用于:
将数据暂存区所保存的更新结果写入消息队列,通过消息队列将更新结果发送至数据库的消费端。
可选的,该装置还包括删除单元409,用于:
响应业务端针对执行结果反馈的回滚命令,删除已保存的更新结果。
同理,回滚命令同样可以由接收单元401接收,随后接收单元401再触发删除单元409执行上述步骤。
此外,接收单元401还可以接收业务端反馈的下一条数据库指令,进而触发解析单元402以及后续的其他单元重复上述过程。
执行单元404还用于:
若数据库指令的类型为数据查询指令或者数据控制指令,直接执行调用当前运行线程执行数据库指令步骤。
可选的,该装置还可以包括检测单元410,用于在解析数据库指令,以确定数据库指令的类型之前,执行:
对数据库指令执行注入检测;
若数据库指令通过注入检测,触发解析单元402执行解析数据库指令,以确定数据库指令的类型;
若数据库指令未通过注入检测,删除数据库指令,并向业务端反馈注入检测失败的提示信息。
上述各个单元中,解析单元相当于图3所示的SQL解析模块,设置单元和判断单元包含于图3的语句改写模块中,执行单元,反馈单元,捕获单元,发送单元和删除单元包含于图3所示的语句执行模块中,检测单元相当于图3所示的数据访问层。
本申请实施例所提供的数据同步装置,其具体工作原理可以参考本申请任一实施例所提供的数据同步的方法,此处不再赘述。
本申请提供一种数据同步的装置,接收单元401接收业务端提供的数据库指令;解析单元402解析数据库指令,以确定数据库指令的类型;若数据库指令的类型为数据操纵指令或者为数据定义指令,设置单元403在当前运行线程的线程上下文中设置捕获上下文;执行单元404调用当前运行线程执行数据库指令;反馈单元405向业务端反馈数据库指令的执行结果,并且,捕获单元406根据预先设置的捕获上下文,保存数据库的更新结果;其中,更新结果包括数据库指令更新后的数据或者结构;发送单元407响应业务端针对执行结果反馈的提交命令,将更新结果发送至数据库的消费端,使消费端基于更新结果实现数据同步。本方案直接捕获并向消费端发送数据库的更新结果,使得消费端在数据同步时不需要处理与更新结果无关的日志数据,提高了消费端数据同步的效率。
本申请实施例还提供一种计算机存储介质,用于存储计算机程序,存储的计算机程序被执行时,具体用于实现本申请实施例所提供的数据同步的方法。
本申请实施例还提供一种电子设备,如图5所示,包括存储器501和处理器502。
其中,存储器501用于存储计算机程序;
处理器502用于执行该计算机程序,具体用于实现本申请任一实施例所提供的数据同步的方法。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
需要注意,本发明中提及的“第一”、“第二”等概念仅用于对不同的装置、模块或单元进行区分,并非用于限定这些装置、模块或单元所执行的功能的顺序或者相互依存关系。
专业技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (9)
1.一种数据同步的方法,其特征在于,包括:
接收业务端发送的数据库指令;
解析所述数据库指令,得到所述数据库指令的类型;
若所述数据库指令的类型为数据操纵指令或者数据定义指令,在当前运行线程的线程上下文中设置捕获上下文;其中,所述数据操纵指令指代用于更新所述数据库的数据的指令;所述数据定义指令指代用于更新所述数据库的结构的指令,所述捕获上下文为若干项用于控制当前运行线程捕获更新结果的参数;
调用所述当前运行线程执行所述数据库指令;
向所述业务端反馈所述数据库指令的执行结果,并根据所述当前运行线程的线程上下文中的捕获上下文,保存所述数据库指令被执行后所述数据库的更新结果;
响应所述业务端针对所述执行结果反馈的提交命令,将所述更新结果发送至所述数据库的消费端,使所述消费端基于所述更新结果实现数据同步;
其中,所述保存所述数据库指令被执行后所述数据库的更新结果,包括:
若所述数据库指令属于数据操纵指令,保存所述数据库中被更新的数据,所述被更新的数据由预先添加至所述数据库指令的返回指令反馈;
若所述数据库指令属于数据定义指令,保存所述数据库中被更新的结构。
2.根据权利要求1所述的方法,其特征在于,所述在当前运行线程的线程上下文中设置捕获上下文之前,还包括:
若所述数据库指令属于数据操纵指令,判断目标数据是否属于预先指定的待同步数据表;其中,所述目标数据指代所述数据库指令所要更新的数据;
若所述目标数据属于所述待同步数据表,执行所述在当前运行线程的线程上下文中设置捕获上下文步骤;
若所述目标数据不属于所述待同步数据表,执行所述调用所述当前运行线程执行所述数据库指令步骤。
3.根据权利要求1所述的方法,其特征在于,所述保存所述数据库指令被执行后所述数据库的更新结果,包括:
将所述数据库指令被执行后所述数据库的更新结果保存在数据暂存区;
其中,所述将所述更新结果发送至所述数据库的消费端,包括:
将所述数据暂存区所保存的所述更新结果写入消息队列,通过所述消息队列将所述更新结果发送至所述数据库的消费端。
4.根据权利要求1所述的方法,其特征在于,所述向所述业务端反馈所述数据库指令的执行结果之后,还包括:
响应所述业务端针对所述执行结果反馈的回滚命令,删除已保存的所述更新结果。
5.根据权利要求1所述的方法,其特征在于,所述解析所述数据库指令,得到所述数据库指令的类型之后,还包括:
若所述数据库指令的类型为数据查询指令或者数据控制指令,执行所述调用所述当前运行线程执行所述数据库指令步骤。
6.根据权利要求1至5任意一项所述的方法,其特征在于,所述解析所述数据库指令,得到所述数据库指令的类型之前,还包括:
对所述数据库指令执行注入检测;
若所述数据库指令通过所述注入检测,执行所述解析所述数据库指令,得到所述数据库指令的类型步骤;
若所述数据库指令未通过所述注入检测,删除所述数据库指令,并向所述业务端反馈注入检测失败的提示信息。
7.一种数据同步的装置,其特征在于,包括:
接收单元,用于接收业务端发送的数据库指令;
解析单元,用于解析所述数据库指令,得到所述数据库指令的类型;
设置单元,用于:若所述数据库指令的类型为数据操纵指令或者数据定义指令,在当前运行线程的线程上下文中设置捕获上下文;其中,所述数据操纵指令指代用于更新所述数据库的数据的指令;所述数据定义指令指代用于更新所述数据库的结构的指令,所述捕获上下文为若干项用于控制当前运行线程捕获更新结果的参数;
执行单元,用于调用所述当前运行线程执行所述数据库指令;
反馈单元,用于向所述业务端反馈所述数据库指令的执行结果;
捕获单元,用于根据所述当前运行线程的线程上下文中的捕获上下文,保存所述数据库指令被执行后所述数据库的更新结果,其中,所述保存所述数据库指令被执行后所述数据库的更新结果,包括:若所述数据库指令属于数据操纵指令,保存所述数据库中被更新的数据,所述被更新的数据由预先添加至所述数据库指令的返回指令反馈;若所述数据库指令属于数据定义指令,保存所述数据库中被更新的结构;
发送单元,用于响应所述业务端针对所述执行结果反馈的提交命令,将所述更新结果发送至所述数据库的消费端,使所述消费端基于所述更新结果实现数据同步。
8.一种电子设备,其特征在于,包括存储器和处理器;
其中,所述存储器用于存储计算机程序;
所述处理器用于执行所述计算机程序,具体用于实现如权利要求1至6任意一项所述的数据同步的方法。
9.一种计算机存储介质,其特征在于,用于存储计算机程序,所述计算机程序被执行时,具体用于实现如权利要求1至6任意一项所述的数据同步的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110191407.7A CN112559638B (zh) | 2021-02-20 | 2021-02-20 | 数据同步的方法、装置、设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110191407.7A CN112559638B (zh) | 2021-02-20 | 2021-02-20 | 数据同步的方法、装置、设备和存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112559638A CN112559638A (zh) | 2021-03-26 |
CN112559638B true CN112559638B (zh) | 2021-05-07 |
Family
ID=75034439
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110191407.7A Active CN112559638B (zh) | 2021-02-20 | 2021-02-20 | 数据同步的方法、装置、设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112559638B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113282611B (zh) * | 2021-06-29 | 2024-04-23 | 深圳平安智汇企业信息管理有限公司 | 一种流数据同步的方法、装置、计算机设备及存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108683936A (zh) * | 2018-05-15 | 2018-10-19 | 杭州橙鹰数据技术有限公司 | 一种数据同步的方法及装置 |
CN110347747A (zh) * | 2019-06-14 | 2019-10-18 | 平安科技(深圳)有限公司 | 数据库间数据同步方法、系统、计算机设备及存储介质 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103647669B (zh) * | 2013-12-16 | 2017-04-05 | 上海证券交易所 | 一种保证分布式数据处理一致性的系统及方法 |
US10853353B2 (en) * | 2018-08-03 | 2020-12-01 | American Express Travel Related Services Company, Inc. | Blockchain-enabled datasets shared across different database systems |
CN110795443A (zh) * | 2019-10-08 | 2020-02-14 | 中国建设银行股份有限公司 | 数据同步的方法、装置、设备和计算机可读介质 |
CN111625552B (zh) * | 2020-05-20 | 2024-01-02 | 北京百度网讯科技有限公司 | 数据收集方法、装置、设备和可读存储介质 |
-
2021
- 2021-02-20 CN CN202110191407.7A patent/CN112559638B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108683936A (zh) * | 2018-05-15 | 2018-10-19 | 杭州橙鹰数据技术有限公司 | 一种数据同步的方法及装置 |
CN110347747A (zh) * | 2019-06-14 | 2019-10-18 | 平安科技(深圳)有限公司 | 数据库间数据同步方法、系统、计算机设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN112559638A (zh) | 2021-03-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107506451B (zh) | 用于数据交互的异常信息监控方法及装置 | |
WO2020253399A1 (zh) | 日志分类规则的生成方法、装置、设备及可读存储介质 | |
US6980988B1 (en) | Method of applying changes to a standby database system | |
US10853157B2 (en) | Compact binary event log generation | |
WO2020238858A1 (zh) | 数据迁移方法、装置、及计算机可读存储介质 | |
CN112685433B (zh) | 元数据更新方法、装置、电子设备及计算机可读存储介质 | |
WO2019196226A1 (zh) | 制度信息查询方法、装置、计算机设备和存储介质 | |
US20050108283A1 (en) | Method of and system for associating an electronic signature with an electronic record | |
CA2684822A1 (en) | Data transformation based on a technical design document | |
WO2019200750A1 (zh) | 报表监控方法、装置、计算机设备和存储介质 | |
CN112231407B (zh) | PostgreSQL数据库的DDL同步方法、装置、设备和介质 | |
CN110765195A (zh) | 一种数据解析方法、装置、存储介质及电子设备 | |
CN112463800A (zh) | 数据读取方法、装置、服务器及存储介质 | |
CN112559638B (zh) | 数据同步的方法、装置、设备和存储介质 | |
CN105653356B (zh) | 处理多服务器并发操作的方法及装置 | |
US10915510B2 (en) | Method and apparatus of collecting and reporting database application incompatibilities | |
CN115455058A (zh) | 缓存数据的处理方法、装置、计算机设备及存储介质 | |
CN111611276A (zh) | 数据查询方法、装置及存储介质 | |
EP2904520B1 (en) | Reference data segmentation from single to multiple tables | |
CN113157411B (zh) | 一种基于Celery的可靠可配置任务系统及装置 | |
CN111353116B (zh) | 内容检测方法、系统及设备、客户端设备和存储介质 | |
CN111198869A (zh) | 数据迁移方法、装置、设备及计算机可读存储介质 | |
CN112612647A (zh) | 日志并行重演方法、装置、设备及存储介质 | |
CN110674119A (zh) | 数据处理方法、系统与计算机可读存储介质 | |
CN113051329B (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 |