买专利,只认龙图腾
首页 专利交易 科技果 科技人才 科技服务 商标交易 会员权益 IP管家助手 需求市场 关于龙图腾
 /  免费注册
到顶部 到底部
清空 搜索

【发明授权】数据同步方法及装置_北京奇虎科技有限公司_201611219560.1 

申请/专利权人:北京奇虎科技有限公司

申请日:2016-12-26

公开(公告)日:2020-01-10

公开(公告)号:CN106528893B

主分类号:G06F16/27(20190101)

分类号:G06F16/27(20190101);H04L29/08(20060101)

优先权:

专利状态码:有效-授权

法律状态:2020.01.10#授权;2017.04.19#实质审查的生效;2017.03.22#公开

摘要:本发明公开了一种数据同步方法及装置,涉及计算机网络技术领域。其中方法包括:从源数据库中读取数据;将读取的数据打包成数据块;将数据块保存到数据块池中,并向多个线程发送广播通知;接收到广播通知的空闲线程从数据块池中读取数据块,并将数据块写入目的数据库。本发明中,多个线程并行处理的方式大大提高了数据写入的速度,解决了由于数据写入的速度远低于数据读取的速度而导致的数据写入占用的时间过长的问题,提升了数据同步效率。

主权项:1.一种数据同步方法,所述方法由中间件实现,所述中间件与源数据库建立用于读取数据的至少一条连接,以及创建多个线程,且每个线程与目的数据库建立一条用于写入数据的连接,所述中间件内部预先建立数据块池;所述方法包括:从源数据库中读取数据;将读取的数据打包成数据块;将数据块保存到数据块池中,并向多个线程发送广播通知;接收到广播通知的空闲线程从数据块池中读取数据块,并将数据块写入目的数据库,其中,多个线程支持并行处理的方式将数据块写入目的数据库。

全文数据:数据同步方法及装置技术领域[0001] 本发明涉及计算机网络技术领域,具体涉及一种数据同步方法及装置。背景技术[0002] 基于分布式文件存储的数据库,一般由特定语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。由于单一数据库的处理能力有限,因此在分布式文件存储数据库的解决方案中,基于源数据库,按照业务或功能建立多个目标数据库,从而降低对源数据库的访问压力。当源数据库中的某个数据表发生变化时,需要保证关注该数据表的目标数据库中的该数据表与源数据库中的该数据表发生一致的变化,因此需要一个同步装置来实现目标数据库与源数据库之间数据的同步。[0003] 现有的同步装置所采取的同步方法是,从源数据库读取一条数据,向目的数据库写入该条数据之后,再从源数据库读取下一条数据,继续写入,直至所有数据同步完成。由于数据写入的速度远低于数据读取的速度,现有的同步方法中数据写入占用的时间过长,影响了数据同步效率。发明内容[0004] 鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的数据同步方法及装置。[0005] 根据本发明的一个方面,提供了一种数据同步方法,其包括:[0006] 从源数据库中读取数据;[0007] 将读取的数据打包成数据块;[0008] 将数据块保存到数据块池中,并向多个线程发送广播通知;[0009] 接收到广播通知的空闲线程从数据块池中读取数据块,并将数据块写入目的数据库。[0010] 根据本发明的另一方面,提供了一种数据同步装置,其包括:[0011] 数据读取模块,适于从源数据库中读取数据;[0012] 打包模块,适于将读取的数据打包成数据块;[0013] 保存模块,适于将数据块保存到数据块池中;[0014] 通知模块,适于向多个线程处理模块发送广播通知;[0015] 多个线程处理模块,其中处于空闲状态的线程处理模块适于:从数据块池中读取数据块,并将数据块写入目的数据库。[0016] 根据本发明提供的数据同步方法及装置,从源数据库中读取数据,将读取的数据打包成数据块;将数据块保存到数据块池中,并向多个线程发送广播通知;接收到广播通知的空闲线程从数据块池中读取数据块,并将数据块写入目的数据库。本发明提供的方案不考虑待同步对象的顺序问题。由于数据库中的数据本身之间无顺序,在同步过程中,无需考虑数据之间的顺序问题,因此可以采取并行处理的方式,具体通过多个线程执行将数据块写入目的数据库的操作,多个线程并行运行,一个线程从数据块池中读取一个数据块后,就执行写入操作,写入完成空闲后,如果数据块池中又有新的数据块,再去读取并写入,这种多个线程并行处理的方式大大提高了数据写入的速度,解决了由于数据写入的速度远低于数据读取的速度而导致的数据写入占用的时间过长的问题,提升了数据同步效率。[0017] 上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。附图说明[0018] 通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:[0019] 图1示出了根据本发明一个实施例的数据同步方法的流程示意图;[〇〇2〇]图2示出了根据本发明另一个实施例的数据同步方法的流程示意图;[0021]图3示出了根据本发明一个实施例的数据同步装置的功能框图。具体实施方式[〇〇22]下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。[0023] 为了能提升数据同步效率,本发明实施例提供了一种数据同步方法,该方法为一种第三方解决方案,即通过开发的第三方工具实现将源数据库的数据同步给目的数据库。举例来说,通过中间件实现本发明实施例的方法,中间件与源数据库之间建立用于读取数据的连接,中间件与目的数据库之间建立用于写入数据的连接。中间件执行如下实施例提供的方法,能够提升源数据库和目的数据库之间的数据同步效率。由于利用了中间件,源数据库和目的数据库之间并未直接建立连接,不会改变分布式系统中数据库之间的连接关系,因而不会触发因新建连接而导致的主数据库选举机制,也就不会引起因主数据块选举机制导致的数据库性能受影响的问题。[0024] 图1示出了根据本发明一个实施例的数据同步方法的流程示意图。如图1所示,该方法包括如下步骤:[〇〇25]步骤S101,从源数据库中读取数据。[0026]首先,中间件预先与源数据库建立用于读取数据的至少一条连接。基于数据写入的速度远低于数据读取的速度的现状,中间件与源数据库之间建立一条用于读取数据的连接,即可满足中间件的处理需求。利用所建立的连接,中间件从源数据库中读取数据。具体地,源数据库开设一数据读取端口,中间件访问该数据读取端口读取一条条数据。[〇〇27]步骤S102,将读取的数据打包成数据块。[〇〇28]中间件从源数据库中读取一条条数据,每条数据的数据量比较小。为了增强处理性能,中间件将读取的数据打包成数据块,每个数据块包含若干条数据。数据块具有预设块大小,该预设块大小可根据经验来设定,本发明对此不作限制。[0029] 步骤S103,将数据块保存到数据块池中,并向多个线程发送广播通知。[0030] 中间件内部预先建立了数据块池,并创建了多个线程,每个线程与目的数据库之间建立有一条用于写入数据的连接。中间件将数据块保存到数据块池中,并向多个线程发送广播通知,以通知各个线程有新的数据块需要写入。[0031] 步骤S104,接收到广播通知的空闲线程从数据块池中读取数据块,并将数据块写入目的数据库。[〇〇32]接收到广播通知的线程根据自身的工作状态选择是否读取数据块。为了提高处理速度,本发明要求空闲的线程才可从数据块池中读取数据块。如果在发送广播通知后,当前中间件内没有空闲的线程,则数据块暂存于数据块池中,等待中间件内有线程空闲后,再从数据块池中读取一个数据块,读取成功后执行将数据块写入目的数据库的操作。[0033] 利用本实施例提供的数据同步方法,从源数据库中读取数据,将读取的数据打包成数据块;将数据块保存到数据块池中,并向多个线程发送广播通知;接收到广播通知的空闲线程从数据块池中读取数据块,并将数据块写入目的数据库。本实施例提供的方法不考虑待同步对象的顺序问题。由于数据库中的数据本身之间无顺序,在同步过程中,无需考虑数据之间的顺序问题,因此可以采取并行处理的方式,具体通过多个线程执行将数据块写入目的数据库的操作,多个线程并行运行,一个线程从数据块池中读取一个数据块后,就执行写入操作,写入完成空闲后,如果数据块池中又有新的数据块,再去读取并写入,这种多个线程并行处理的方式大大提高了数据写入的速度,解决了由于数据写入的速度远低于数据读取的速度而导致的数据写入占用的时间过长的问题,提升了数据同步效率。[0034] 图2示出了根据本发明另一个实施例的数据同步方法的流程示意图。如图2所示,该方法包括如下步骤:[〇〇35]步骤S201,与源数据库建立用于读取数据的至少一条连接,以及创建多个线程,且每个线程与目的数据库建立一条用于写入数据的连接。[0036]中间件预先与源数据库建立用于读取数据的至少一条连接。基于数据写入的速度远低于数据读取的速度的现状,中间件与源数据库之间建立一条用于读取数据的连接,即可满足中间件的处理需求。如果一条连接不能满足需求,例如数据写入的速度高于数据读取的速度,也可以建立两条及以上用于读取数据的连接。所谓建立连接具体为源数据库开设至少一个数据读取端口,中间件通过访问该数据读取端口的方式读取数据。[〇〇37]中间件还预先创建有多个线程,每个线程与目的数据库建立一条用于写入数据的连接。多个线程之间为并行处理方式,各个线程之间的运行互不干扰。所创建的线程的数量可根据实际情况而设定,例如根据需要同步的数据总量,中间件资源消耗状况等综合考虑而设定,本发明对此不作限制。每个线程与目的数据库建立一条用于写入数据的连接,具体地,目的数据库为每个线程开设一数据写入端口,线程访问对应的数据写入端口写入数据。[〇〇38]步骤S202,从源数据库中读取数据。[0039] 基于所建立的连接,中间件从源数据库中读取数据。[0040] 步骤S203,按照预设块大小,将读取的数据打包成数据块。[0041] 中间件从源数据库中读取一条条数据,每条数据的数据量比较小。为了增强处理性能,中间件将读取的数据打包成数据块,每个数据块包含若干条数据。数据块具有预设块大小,该预设块大小可根据经验来设定,本发明对此不作限制。通过将数据打包成数据块,由于数据块的大小相对固定,使得后续各个线程处理一个数据块的时间相差不大,各个线程之间负载相对均衡,优化处理性能。[0042]举例来说,假设预设块大小为16M,在进行打包处理时,按照数据读取的先后顺序对先读取的数据进行打包,当数据量接近16M时,一个数据块打包完成,继续打包下一数据块。由于每条数据的数据量相差较大,本发明不严格要求每个数据块的大小都是16M,而是接近16M即可,有的数据块可略大于16M,有的数据块可略小于16M。[〇〇43]步骤S204,将数据块保存到数据块池中,并向多个线程发送广播通知。[0044] 中间件内部预先建立了数据块池,中间件将数据块保存到数据块池中,并向多个线程发送广播通知,以通知各个线程有新的数据块需要写入。本发明中,数据块池用于暂时存储数据块,当多个线程的写数据的速度不如读数据的速度快时,数据块池存储的数据块有可能越来越多,为了避免数据量超过数据块池的内存限制,导致数据块丢失的问题,本发明对数据块池暂存的数据块的数量或数据量进行限制。[0045] 在一个具体实施例中,方法还可包括:判断数据块池中的数据块的数量是否到达预设数量阈值;若是,则停止从源数据库中读取数据,直至数据块池中的数据块的数量小于预设数量阈值。在这个实施例中,对数据块池暂存的数据块的数量限制为不能超过预设数量阈值,一旦超过,则停止从源数据库中读取数据。[0046] 在另一个具体地实施例中,方法还可包括:判断数据块池中的数据量是否到达预设阈值;若是,则停止从源数据库中读取数据,直至数据块池中的数据量小于预设阈值。在这个实施例中,对数据块池暂存的数据量限制为不能超过预设阈值,一旦超过,则停止从源数据库中读取数据。[〇〇47]步骤S205,设置用于锁定数据块读取操作的锁。[0048] 为了避免多个空闲线程同时读取数据块而引发的冲突问题,本实施例设置用于锁定数据块读取操作的锁。只有抢锁成功的线程才可从数据块池中读取数据块。[0049] 步骤S206,多个线程判断自身是否处于空闲状态,判断为空闲状态的线程发起抢锁请求。[0050] 接收到广播通知的线程根据自身的工作状态选择是否读取数据块。为了提高处理速度,本发明要求空闲的线程才可从数据块池中读取数据块。因此,当线程接收到广播通知后,判断自身是否处于空闲状态,若是,则发起抢锁请求。[0051] 步骤S207,抢锁成功的空闲线程从数据块池中读取数据块。[〇〇52]步骤S208,抢锁成功的空闲线程从数据块池中成功读取一个数据块之后,对锁进行释放处理。[〇〇53]抢锁成功的空闲线程从数据块池中成功读取一个数据块之后,对锁进行释放处理。之前抢锁失败的空闲线程可以再次发起抢锁请求,再由抢锁成功的空闲线程从数据块池中读取数据块,如果数据块池中已没有数据块,则空闲线程继续等待广播通知。[0054] 步骤S209,抢锁成功的空闲线程将数据块写入目的数据库。[0055] 抢锁成功的空闲线程将数据块解析为一条条数据,将数据写入目的数据块。具体地,抢锁成功的空闲线程访问目的数据库为其开设的数据写入端口,向目的数据库写入数据。[0056]本实施例提供的数据同步方法适用于MongoDB分布式数据库系统。MongoDB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是面向集合的数据库系统。所谓面向集合,是指数据被分组存储在数据集中,被称为一个集合。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各种复杂的文件类型。这种存储形式被称为BSONBinarySerializedDocumentFormat〇[〇〇57]本实施例提供的方法不仅可以同步两个MongoDB源数据库和目的数据库的所有数据,还可以同步两个MongoDB的部分数据,例如同步指定集合的数据。中间件在同步过程中,还可以对指定集合的相关字段进行修改,例如对指定集合的命名进行修改。在源数据库中命名为A的集合,同步给目的数据库中更名为B,A集合和B集合的数据内容一致。下面以将源数据库的A集合同步给目的数据库为例介绍本发明的实现方案。[〇〇58]首先,中间件与源数据库建立用于读取数据的至少一条连接,以及创建多个线程,且每个线程与目的数据库建立一条用于写入数据的连接;[0059] 中间件从源数据库中读取A集合的数据。可选地,如果需要对A集合的命名做出更改,则中间件解析出A集合数据的命名字段,将A集合的命名字段进行统一替换,得到B集合;[0060] 中间件按照预设块大小,将B集合数据打包成数据块;[0061] 中间件将数据块保存到数据块池中,并向多个线程发送广播通知;[〇〇62]中间件设置用于锁定数据块读取操作的锁;[0063] 多个线程判断自身是否处于空闲状态,判断为空闲状态的线程发起抢锁请求;[0064] 抢锁成功的空闲线程从数据块池中读取数据块;[0065] 抢锁成功的空闲线程从数据块池中成功读取一个数据块之后,对锁进行释放处理。[0066] 抢锁成功的空闲线程将数据块写入目的数据库。[0067] 利用本实施例提供的数据同步方法,通过与源数据库和目的数据库建立连接,从源数据库读取数据之后,将数据打包成数据块放入数据块池中;设置用于锁定数据块读取操作的锁,空闲线程发起抢锁请求,抢锁成功的空闲线程从数据块池中读取数据块,将其写入目的数据库。本实施例提供的方法不考虑待同步对象的顺序问题。由于数据库中的数据本身之间无顺序,在同步过程中,无需考虑数据之间的顺序问题,因此可以采取并行处理的方式,具体通过多个线程执行将数据块写入目的数据库的操作,多个线程并行运行,一个线程从数据块池中读取一个数据块后,就执行写入操作,写入完成空闲后,如果数据块池中又有新的数据块,再去读取并写入,这种多个线程并行处理的方式大大提高了数据写入的速度,解决了由于数据写入的速度远低于数据读取的速度而导致的数据写入占用的时间过长的问题,提升了数据同步效率。另外,通过将数据打包成数据块,由于数据块的大小相对固定,使得后续各个线程处理一个数据块的时间相差不大,各个线程之间负载相对均衡,优化处理性能。进一步的,为了避免数据量超过数据块池的内存限制,导致数据块丢失的问题,本发明对数据块池暂存的数据块的数量或数据量进行限制,避免了堵塞引发的问题。利用锁机制,避免了多个空闲线程同时读取数据块而引发的冲突问题。本实施例提供的数据同步方法尤其适用于MongoDB分布式数据库系统,不仅可以同步两个MongoDB的所有数据,还可以同步两个MongoDB的指定集合的数据。[〇〇68]本实施例的数据同步方法是一种第三方解决方案,具体可利用中间件实现。由于利用了中间件,源数据库和目的数据库之间并未直接建立连接,不会改变分布式系统中数据库之间的连接关系,因而不会触发因新建连接而导致的主数据库选举机制,也就不会引起因主数据块选举机制导致的数据库性能受影响的问题。[0069]图3示出了根据本发明一个实施例的数据同步装置的功能框图。如图3所示,该装置包括:数据读取模块301,打包模块302,保存模块303,通知模块304,以及多个线程处理模块305。[〇〇7〇]数据读取模块301,适于从源数据库中读取数据。[0071]进一步的,数据读取模块301还适于:与源数据库建立用于读取数据的至少一条连接。[〇〇72]数据读取模块301预先与源数据库建立用于读取数据的至少一条连接。基于数据写入的速度远低于数据读取的速度的现状,数据读取模块301与源数据库之间建立一条用于读取数据的连接,即可满足数据同步装置的处理需求。如果一条连接不能满足需求,例如数据写入的速度高于数据读取的速度,也可以建立两条及以上用于读取数据的连接。所谓建立连接具体为源数据库开设至少一个数据读取端口,数据读取模块301通过访问该数据读取端口的方式读取数据。[〇〇73]打包模块302,适于将读取的数据打包成数据块。由于数据读取模块301所读取的每条数据的数据量比较小,为了增强处理性能,打包模块302按照预设块大小,将读取的数据打包成数据块,每个数据块包含若干条数据。数据块具有预设块大小,该预设块大小可根据经验来设定,本发明对此不作限制。通过将数据打包成数据块,由于数据块的大小相对固定,使得后续各个线程处理一个数据块的时间相差不大,各个线程之间负载相对均衡,优化处理性能。[0074]保存模块303,适于将数据块保存到数据块池中。[〇〇75]通知模块304,适于向多个线程处理模块发送广播通知,以通知各个线程有新的数据块需要写入。[0076]本发明中,数据块池用于暂时存储数据块,当多个线程处理模块的写数据的速度不如读数据的速度快时,数据块池存储的数据块有可能越来越多,为了避免数据量超过数据块池的内存限制,导致数据块丢失的问题,本发明对数据块池暂存的数据块的数量或数据量进行限制。[〇〇77]数据读取模块301还适于:判断数据块池中的数据块的数量是否到达预设数量阈值;若是,则停止从源数据库中读取数据,直至数据块池中的数据块的数量小于预设数量阈值。[〇〇78]数据读取模块301还适于:判断数据块池中的数据量是否到达预设阈值;若是,则停止从源数据库中读取数据,直至数据块池中的数据量小于预设阈值。[〇〇79]多个线程处理模块305,其中处于空闲状态的线程处理模块适于:从数据块池中读取数据块,并将数据块写入目的数据库。[0080] 进一步的,该装置还包括:创建模块306,适于创建多个线程处理模块。[0081] 每个线程处理模块适于:与目的数据库建立一条用于写入数据的连接。[0082]每个线程处理模块与目的数据库建立一条用于写入数据的连接。多个线程处理模块之间为并行处理方式,各个线程处理模块之间的运行互不干扰。所创建的线程处理模块的数量可根据实际情况而设定,例如根据需要同步的数据总量,数据同步装置资源消耗状况等综合考虑而设定,本发明对此不作限制。每个线程处理模块与目的数据库建立一条用于写入数据的连接,具体地,目的数据库为每个线程处理模块开设一数据写入端口,线程处理模块访问对应的数据写入端口写入数据。[〇〇83]进一步的,该装置还包括:锁设置模块307,适于设置用于锁定数据块读取操作的锁。为了避免多个空闲线程同时读取数据块而引发的冲突问题,本装置设置用于锁定数据块读取操作的锁,只有抢锁成功的线程处理模块才可从数据块池中读取数据块。[〇〇84]线程处理模块305进一步适于:判断自身是否处于空闲状态,若是,则发起抢锁请求。[〇〇85]其中,抢锁成功的线程处理模块进一步适于:从数据块池中读取数据块,将数据块写入目的数据库。[0086]抢锁成功的线程处理模块还适于:在从数据块池中成功读取一个数据块之后,对锁进行释放处理。[〇〇87]本实施例提供的装置不仅可以同步两个MongoDB源数据库和目的数据库的所有数据,还可以同步两个MongoDB的部分数据,例如同步指定集合的数据。装置在同步过程中,还可以对指定集合的相关字段进行修改,例如对指定集合的命名进行修改。在源数据库中命名为A的集合,同步给目的数据库中更名为B,A集合和B集合的数据内容一致。下面以将源数据库的A集合同步给目的数据库为例介绍本发明的实现方案。[0088]利用本实施例提供的数据同步装置,通过与源数据库和目的数据库建立连接,从源数据库读取数据之后,将数据打包成数据块放入数据块池中;设置用于锁定数据块读取操作的锁,空闲线程发起抢锁请求,抢锁成功的空闲线程从数据块池中读取数据块,将其写入目的数据库。本实施例提供的装置不考虑待同步对象的顺序问题。由于数据库中的数据本身之间无顺序,在同步过程中,无需考虑数据之间的顺序问题,因此可以采取并行处理的方式,具体通过多个线程处理模块执行将数据块写入目的数据库的操作,多个线程处理模块并行运行,一个线程处理模块从数据块池中读取一个数据块后,就执行写入操作,写入完成空闲后,如果数据块池中又有新的数据块,再去读取并写入,这种多个线程处理模块并行处理的方式大大提高了数据写入的速度,解决了由于数据写入的速度远低于数据读取的速度而导致的数据写入占用的时间过长的问题,提升了数据同步效率。另外,通过将数据打包成数据块,由于数据块的大小相对固定,使得后续各个线程处理模块处理一个数据块的时间相差不大,各个线程处理模块之间负载相对均衡,优化处理性能。进一步的,为了避免数据量超过数据块池的内存限制,导致数据块丢失的问题,本发明对数据块池暂存的数据块的数量或数据量进行限制,避免了堵塞引发的问题。利用锁机制,避免了多个空闲线程同时读取数据块而引发的冲突问题。本实施例提供的数据同步装置尤其适用于MongoDB分布式数据库系统,不仅可以同步两个MongoDB的所有数据,还可以同步两个MongoDB的指定集合的数据。[〇〇89]在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。[0090] 在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。[0091] 类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。[0092] 本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书包括伴随的权利要求、摘要和附图中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书包括伴随的权利要求、摘要和附图中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。[0093] 此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。[0094] 本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器DSP来实现根据本发明实施例的数据同步装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序例如,计算机程序和计算机程序产品。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。[0095] 应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。[0096] 本发明公开了:A1、一种数据同步方法,其包括:[〇〇97]从源数据库中读取数据;[〇〇98] 将读取的数据打包成数据块;[0099] 将数据块保存到数据块池中,并向多个线程发送广播通知;[0100] 接收到广播通知的空闲线程从数据块池中读取数据块,并将数据块写入目的数据库。[〇1〇1] A2、根据A1所述的方法,其中,在从源数据库中读取数据之前,所述方法还包括:与源数据库建立用于读取数据的至少一条连接,以及创建所述多个线程,且每个线程与目的数据库建立一条用于写入数据的连接。[0102] A3、根据A1所述的方法,其中,所述将读取的数据打包成数据块进一步包括:按照预设块大小,将读取的数据打包成数据块。[0103] A4、根据A1所述的方法,其中,在所述向多个线程发送广播通知之后,所述方法还包括:[0104] 设置用于锁定数据块读取操作的锁;[0105] 所述多个线程判断自身是否处于空闲状态,若是,则发起抢锁请求;[0106] 所述接收到广播通知的空闲线程从数据块池中读取数据块具体为:抢锁成功的空闲线程从数据块池中读取数据块。[0107] A5、根据A4所述的方法,其中,在抢锁成功的空闲线程从数据块池中成功读取一个数据块之后,所述方法还包括:抢锁成功的空闲线程释放锁。[0108] A6、根据A1或A4所述的方法,其中,所述方法还包括:[0109] 判断所述数据块池中的数据块的数量是否到达预设数量阈值;[0110] 若是,则停止从源数据库中读取数据,直至所述数据块池中的数据块的数量小于所述预设数量阈值。[0111] A7、根据A1或A4所述的方法,其中,所述方法还包括:[0112] 判断所述数据块池中的数据量是否到达预设阈值;[0113] 若是,则停止从源数据库中读取数据,直至所述数据块池中的数据量小于所述预设阈值。[0114] 本发明公开了:B8、一种数据同步装置,其包括:[0115] 数据读取模块,适于从源数据库中读取数据;[0116] 打包模块,适于将读取的数据打包成数据块;[0117] 保存模块,适于将数据块保存到数据块池中;[0118] 通知模块,适于向多个线程处理模块发送广播通知;[0119] 多个线程处理模块,其中处于空闲状态的线程处理模块适于:从数据块池中读取数据块,并将数据块写入目的数据库。[〇12〇] B9、根据B8所述的装置,其中,所述数据读取模块还适于:与源数据库建立用于读取数据的至少一条连接;[0121] 所述装置还包括:创建模块,适于创建多个线程处理模块;[0122] 每个所述线程处理模块适于:与目的数据库建立一条用于写入数据的连接。[0123] B10、根据B8所述的装置,其中,所述打包模块具体适于:按照预设块大小,将读取的数据打包成数据块。[0124] B11、根据B8所述的装置,其中,所述装置还包括:[0125] 锁设置模块,适于设置用于锁定数据块读取操作的锁;[0126] 所述线程处理模块进一步适于:判断自身是否处于空闲状态,若是,则发起抢锁请求;[0127] 其中,抢锁成功的线程处理模块进一步适于:从数据块池中读取数据块,将数据块写入目的数据库。[0128] B12、根据B11所述的装置,其中,所述抢锁成功的线程处理模块还适于:在从数据块池中成功读取一个数据块之后,对锁进行释放处理。[0129] B13、根据B8或B11所述的装置,其中,所述数据读取模块还适于:判断所述数据块池中的数据块的数量是否到达预设数量阈值;若是,则停止从源数据库中读取数据,直至所述数据块池中的数据块的数量小于所述预设数量阈值。[〇13〇] B14、根据B8或B11所述的装置,其中,所述数据读取模块还适于:判断所述数据块池中的数据量是否到达预设阈值;若是,则停止从源数据库中读取数据,直至所述数据块池中的数据量小于所述预设阈值。

权利要求:1.一种数据同步方法,其包括:从源数据库中读取数据;将读取的数据打包成数据块;将数据块保存到数据块池中,并向多个线程发送广播通知;接收到广播通知的空闲线程从数据块池中读取数据块,并将数据块写入目的数据库。2.根据权利要求1所述的方法,其中,在从源数据库中读取数据之前,所述方法还包括:与源数据库建立用于读取数据的至少一条连接,以及创建所述多个线程,且每个线程与目的数据库建立一条用于写入数据的连接。3.根据权利要求1所述的方法,其中,所述将读取的数据打包成数据块进一步包括:按照预设块大小,将读取的数据打包成数据块。4.根据权利要求1所述的方法,其中,在所述向多个线程发送广播通知之后,所述方法还包括:设置用于锁定数据块读取操作的锁;所述多个线程判断自身是否处于空闲状态,若是,则发起抢锁请求;所述接收到广播通知的空闲线程从数据块池中读取数据块具体为:抢锁成功的空闲线程从数据块池中读取数据块。5.根据权利要求4所述的方法,其中,在抢锁成功的空闲线程从数据块池中成功读取一个数据块之后,所述方法还包括:抢锁成功的空闲线程释放锁。6.根据权利要求1或4所述的方法,其中,所述方法还包括:判断所述数据块池中的数据块的数量是否到达预设数量阈值;若是,则停止从源数据库中读取数据,直至所述数据块池中的数据块的数量小于所述预设数量阈值。7.根据权利要求1或4所述的方法,其中,所述方法还包括:判断所述数据块池中的数据量是否到达预设阈值;若是,则停止从源数据库中读取数据,直至所述数据块池中的数据量小于所述预设阈值。8.—种数据同步装置,其包括:数据读取模块,适于从源数据库中读取数据;打包模块,适于将读取的数据打包成数据块;保存模块,适于将数据块保存到数据块池中;通知模块,适于向多个线程处理模块发送广播通知;多个线程处理模块,其中处于空闲状态的线程处理模块适于:从数据块池中读取数据块,并将数据块写入目的数据库。9.根据权利要求8所述的装置,其中,所述数据读取模块还适于:与源数据库建立用于读取数据的至少一条连接;所述装置还包括:创建模块,适于创建多个线程处理模块;每个所述线程处理模块适于:与目的数据库建立一条用于写入数据的连接。10.根据权利要求8所述的装置,其中,所述打包模块具体适于:按照预设块大小,将读取的数据打包成数据块。

百度查询: 北京奇虎科技有限公司 数据同步方法及装置

免责声明
1、本报告根据公开、合法渠道获得相关数据和信息,力求客观、公正,但并不保证数据的最终完整性和准确性。
2、报告中的分析和结论仅反映本公司于发布本报告当日的职业理解,仅供参考使用,不能作为本公司承担任何法律责任的依据或者凭证。