一种向数据库插入数据的方法及装置制造方法
【专利摘要】一种向数据库插入数据的方法及装置,所述方法包括:获取需要向数据库的第一数据表插入的行数据,该行数据中的每个数据项与第一数据表中的每个字段一一对应,所述第一数据表与第一计数器、第一缓冲区和第一读写锁相互对应;按照下述方式完成向数据库插入数据的操作:使第一计数器累加一个计数,并将行数据放入第一缓冲区中;判断第一计数器中的计数值是否达到设定阈值;如果是,则使第一计数器中的计数值置为零,将第一缓冲区中缓冲的所有行数据放入第一数据表中,清除第一缓冲区中缓冲的所有行数据,继续执行获取行数据的步骤;如果否,则继续执行获取行数据的步骤;其中,在至少一次的第一读写锁的访问控制期间完成上述操作中的读写操作。
【专利说明】一种向数据库插入数据的方法及装置
【技术领域】
[0001]本发明涉及数据库【技术领域】,尤其涉及一种向数据库插入数据的方法及装置。
【背景技术】
[0002]关系数据库是建立在关系模型基础上的数据库,其借助于集合代数等数学概念和方法来处理数据库中的数据,譬如,M y S QL就是一个关系型数据库管理系统。MySQL数据库既支持单行的插入操作,也支持多行批量插入操作。例如:单行插入操作的形式为:insert into t a b I e _ a va I ue s(a I, b I, c I),表示将数组(a I, b I, c I)插入到表t a b I e _ a中;多行插入操作的形式为:i n s ert into t a b I e _ a values (a I, b I, cl), (a 2, b 2,
c 2),表示将数组(a I, b I, c I)和(a 2, b 2, c 2)插入到表t a b I e _a中。一般而言,若需要插入相同数目的行,一次多行插入操作的效率要比多次单行插入的效率要高,举个例子,当往同一个表中插入10行数据时,一次批量插入操作比10次单行插入效率要高很多。
[0003]现有方案中,在多线程环境下,每个线程有自己单独的缓冲区,即缓冲区不会横跨线程。当需要向数据库的表t a b I e _ a中插入多行数据时,若每行数据中的数据顺序均相同、且每行数据都没有缺失的情况下,则将所述多行数据放入对应线程的缓冲区中,待所述缓冲区中的数据行数达到设定阈值时,便将所述多行数据批量插入到数据库中的表ta b I e _ a中;若因某行数据中存在缺省项导致需要插入的行数据顺序与数据库中的行数据顺序不对应,则对该行数据进行处理并采用单行插入的方式将该行数据插入到数据库中。
[0004]但是,由于每个线程单独拥有缓冲区,每个缓冲区只有达到阈值要求时才能进行批量插入,基于数据较大地分散在各个线程的缓冲区中,若缓冲区中的行数据数量长时间不能满足阈值要求,将导致缓冲区的行数据长时间处于等待的状态,从而降低了数据插入的效率,若采用单行插入的方式将导致数据插入效率较低。
【发明内容】
[0005]有鉴于此,本发明实施例的主要目的在于提供一种向数据库插入数据的方法及装置,以实现提高数据插入效率的目的。
[0006]为实现上述目的,本发明提供了一种向数据库插入数据的方法,所述数据库中的每个数据表与一个计数器、一个缓冲区和一个读写锁相互对应,所述方法包括:
[0007]获取需要向所述数据库的第一数据表插入的行数据,所述行数据中的每个数据项与所述第一数据表中的每个字段一一对应,所述第一数据表与第一计数器、第一缓冲区和第一读写锁相互对应;
[0008]按照下述方式完成向数据库插入数据的操作:
[0009]使所述第一计数器累加一个计数,并将所述行数据放入所述第一缓冲区中;判断所述第一计数器中的计数值是否达到设定阈值;如果是,则使所述第一计数器中的计数值置为零,将所述第一缓冲区中缓冲的所有行数据放入所述第一数据表中,清除所述第一缓冲区中缓冲的所有行数据,继续执行所述获取需要向所述数据库的第一数据表插入的行数据的步骤;如果否,则继续执行所述获取需要向所述数据库的第一数据表插入的行数据的步骤;其中,在至少一次的所述第一读写锁的访问控制期间完成上述操作中的读写操作,所述第一读写锁的访问控制期间是从开启所述第一读写锁后到关闭所述第一读写锁前的期间。
[0010]优选地,具体按照下述方式完成向数据库插入数据的操作:
[0011]在第一次开启所述第一读写锁的写模式后、且在第一次关闭所述第一读写锁的写模式前,使所述第一计数器累加一个计数,并将所述行数据放入所述第一缓冲区中;
[0012]判断所述第一计数器中的计数值是否达到设定阈值;
[0013]如果是,则在第二次开启所述第一读写锁的写模式后、且在第二次关闭所述第一读写锁的写模式前,使所述第一计数器中的计数值置为零;在开启所述第一读写锁的读模式后、且在关闭所述第一读写锁的读模式前,将所述第一缓冲区中缓冲的所有行数据放入所述第一数据表中;在第三次开启所述第一读写锁的写模式后、且在第三次关闭所述第一读写锁的写模式前,清除所述第一缓冲区中缓冲的所有行数据;继续执行所述获取需要向所述数据库的第一数据表插入的行数据的步骤;
[0014]如果否,则继续执行所述获取需要向所述数据库的第一数据表插入的行数据的步骤。
[0015]优选地,所述第一数据表与第一预处理表相互对应,所述第一预处理表中按预设顺序存储了所述第一数据表中的每个字段,所述第一预处理表中每个字段对应的初始数据为空值;
[0016]所述获取需要向所述数据库的第一数据表插入的行数据,具体包括:
[0017]将所述行数据中的每个数据项与所述第一预处理表中的字段进行对应,并利用所述每个数据项替换所述第一预处理表中对应字段所对应的空值;
[0018]按所述预设顺序获取与所述预处理表中每个字段对应的每个数据项。
[0019]优选地,所述第一预处理表为第一哈希表。
[0020]优选地,所述第一计数器的计数值和所述第一数据表的表名存储于第二哈希表中,所述第一缓冲区中缓冲的行数据和所述第一数据表的表名存储于第三哈希表中,所述第一读写锁的数据结构和所述第一数据表的表名存储于第四哈希表中;
[0021]所述方法还包括:
[0022]根据哈希算法获取与所述第一数据表的表名对应的第一计数器、第一缓冲区和第一读写锁。
[0023]
[0024]本发明实施例还提供了 一种向数据库插入数据的装置,所述数据库中的每个数据表与一个计数器、一个缓冲区和一个读写锁相互对应,所述装置包括:
[0025]行数据获取模块,用于获取需要向所述数据库的第一数据表插入的行数据,所述行数据中的每个数据项与所述第一数据表中的每个字段一一对应,所述第一数据表与第一计数器、第一缓冲区和第一读写锁相互对应;[0026]数据处理模块,用于按照下述方式完成向数据库插入数据的操作:
[0027]使所述第一计数器累加一个计数,并将所述行数据放入所述第一缓冲区中;判断所述第一计数器中的计数值是否达到设定阈值;如果是,则使所述第一计数器中的计数值置为零,将所述第一缓冲区中缓冲的所有行数据放入所述第一数据表中,清除所述第一缓冲区中缓冲的所有行数据,继续执行所述获取需要向所述数据库的第一数据表插入的行数据的步骤;如果否,则继续执行所述获取需要向所述数据库的第一数据表插入的行数据的步骤;其中,在至少一次的所述第一读写锁的访问控制期间完成上述操作中的读写操作,所述第一读写锁的访问控制期间是从开启所述第一读写锁后到关闭所述第一读写锁前的期间。
[0028]优选地,所述数据处理模块,具体包括:
[0029]第一处理子模块,用于在第一次开启所述第一读写锁的写模式后、且在第一次关闭所述第一读写锁的写模式前,使所述第一计数器累加一个计数,并将所述行数据放入所述第一缓冲区中;
[0030]阈值判断子模块,用于判断所述第一计数器中的计数值是否达到设定阈值;
[0031]第二处理子模块,用于在所述阈值判断子模块判断得到的所述第一计数器中的计数值达到设定阈值时,在第二次开启所述第一读写锁的写模式后、且在第二次关闭所述第一读写锁的写模式前,使所述第一计数器中的计数值置为零;在开启所述第一读写锁的读模式后、且在关闭所述第一读写锁的读模式前,将所述第一缓冲区中缓冲的所有行数据放入所述第一数据表中;在第三次开启所述第一读写锁的写模式后、且在第三次关闭所述第一读写锁的写模式前,清除所述第一缓冲区中缓冲的所有行数据;继续执行所述获取需要向所述数据库的第一数据表插入的行数据的步骤;
[0032]第三处理子模块,用于在所述阈值判断子模块判断得到的所述第一计数器中的计数值未达到设定阈值时,继续利用所述行数据获取模块执行所述获取需要向所述数据库的第一数据表插入的行数据的功能。
[0033]优选地,所述第一数据表与第一预处理表相互对应,所述第一预处理表中按预设顺序存储了所述第一数据表中的每个字段,所述第一预处理表中每个字段对应的初始数据为空值;
[0034]所述行数据获取模块,具体包括:
[0035]数据替换子模块,用于将所述行数据中的每个数据项与所述第一预处理表中的字段进行对应,并利用所述每个数据项替换所述第一预处理表中对应字段所对应的空值;
[0036]行数据获取子模块,用于按所述预设顺序获取与所述预处理表中每个字段对应的每个数据项。
[0037]优选地,所述第一预处理表为第一哈希表。
[0038]优选地,所述第一计数器的计数值和所述第一数据表的表名存储于第二哈希表中,所述第一缓冲区中缓冲的行数据和所述第一数据表的表名存储于第三哈希表中,所述第一读写锁的数据结构和所述第一数据表的表名存储于第四哈希表中;
[0039]所述装置还包括:
[0040]对应项获取模块,用于根据哈希算法获取与所述第一数据表的表名对应的第一计数器、第一缓冲区和第一读写锁。[0041 ] 本发明实施例提供的向数据库插入数据的方法及装置,首先获取满足批量插入要求的行数据,然后,利用读写锁进行控制,以在每次关闭读写锁时,可允许对其它数据表进行计数器修改、数据插入缓冲区、从缓存区读取数据、清空缓冲区数据等相关操作,保证了并发操作的高效性。与现有方案相比,本发明实施例降低了数据入库的时间延迟,同时通过批量插入的方式提高了数据库操作的效率。
【专利附图】
【附图说明】
[0042]为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0043]图1为本发明实施例向数据库插入数据的方法的流程示意图;
[0044]图2为本发明实施例数据读写操作的流程示意图;
[0045]图3为本发明实施例向数据库插入数据的装置的结构示意图。
【具体实施方式】
[0046]为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0047]
[0048]本发明实施例提供的向数据库插入数据的方法及装置,不限制数据库的类型,所述数据库可以是关系型数据库也可以是其它类型的数据库。其中,所述数据库中的每个数据表与一个计数器、一个缓冲区和一个读写锁相互对应,对于所述数据库中的任意一个数据表,比如第一数据表,假设所述第一数据表与第一计数器、第一缓冲区和第一读写锁相互对应。
[0049]参见图1,为本发明实施例提供的向数据库插入数据的方法的流程示意图,该方法包括以下步骤:
[0050]步骤101:获取需要向所述数据库的第一数据表插入的行数据,所述行数据中的每个数据项与所述第一数据表中的每个字段一一对应,所述第一数据表与第一计数器、第一缓冲区和第一读写锁相互对应。
[0051 ] 在本发明实施例中,所述数据库中的每个数据表都对应一个预处理表,其中,所述第一数据表与第一预处理表相互对应,所述第一预处理表中按预设顺序存储了所述第一数据表中的每个字段,所述第一预处理表中每个字段对应的初始数据为空值。
[0052]举例说明,参见表1,假设表I为所述第一预处理表的表结构,它可以是一个哈希表(包括K e y值和V a I U e值,K e y值为第一数据表的字段,V a I u e值为第一数据表的字段对应的实际数据项),即所述第一预处理表为第一哈希表。假设第一数据表的字段有:(第一字段,第二字段,第三字段),此时可按照字母顺序或是数字顺序将第一数据表的每个字段作为K e y值进行排序,譬如,若按照字母顺序排序,则(第一字段,第二字段,第三字段)在表1中为(comlumnA, co IumnB , co IumnC )的形式。在每次使用所述第一预处理表前均要对表中的V a I u e值进行初始化,即将每个K e y值对应的V a I u e值置为空值“NUL L”。
[0053]表1
[0054]
【权利要求】
1.一种向数据库插入数据的方法,其特征在于,所述数据库中的每个数据表与一个计数器、一个缓冲区和一个读写锁相互对应,所述方法包括: 获取需要向所述数据库的第一数据表插入的行数据,所述行数据中的每个数据项与所述第一数据表中的每个字段一一对应,所述第一数据表与第一计数器、第一缓冲区和第一读写锁相互对应; 按照下述方式完成向数据库插入数据的操作: 使所述第一计数器累加一个计数,并将所述行数据放入所述第一缓冲区中;判断所述第一计数器中的计数值是否达到设定阈值;如果是,则使所述第一计数器中的计数值置为零,将所述第一缓冲区中缓冲的所有行数据放入所述第一数据表中,清除所述第一缓冲区中缓冲的所有行数据,继续执行所述获取需要向所述数据库的第一数据表插入的行数据的步骤;如果否,则继续执行所述获取需要向所述数据库的第一数据表插入的行数据的步骤;其中,在至少一次的所述第一读写锁的访问控制期间完成上述操作中的读写操作,所述第一读写锁的访问控制期间是从开启所述第一读写锁后到关闭所述第一读写锁前的期间。
2.根据权利要求1所述的方法,其特征在于,具体按照下述方式完成向数据库插入数据的操作: 在第一次开启所述第一读写锁的写模式后、且在第一次关闭所述第一读写锁的写模式前,使所述第一计数器累加一个计数,并将所述行数据放入所述第一缓冲区中; 判断所述第一计数器中的计数值是否达到设定阈值; 如果是,则在第二次开启所述第一读写锁的写模式后、且在第二次关闭所述第一读写锁的写模式前,使所述第一计数器中的计数值置为零;在开启所述第一读写锁的读模式后、且在关闭所述第一读写锁的读模式前,将所述第一缓冲区中缓冲的所有行数据放入所述第一数据表中;在第三次开启所述第一读写锁的写模式后、且在第三次关闭所述第一读写锁的写模式前,清除所述第一缓冲区中缓冲的所有行数据;继续执行所述获取需要向所述数据库的第一数据表插入的行数据的步骤; 如果否,则继续执行所述获取需要向所述数据库的第一数据表插入的行数据的步骤。
3.根据权利要求1或2所述的方法,其特征在于,所述第一数据表与第一预处理表相互对应,所述第一预处理表中按预设顺序存储了所述第一数据表中的每个字段,所述第一预处理表中每个字段对应的初始数据为空值; 所述获取需要向所述数据库的第一数据表插入的行数据,具体包括: 将所述行数据中的每个数据项与所述第一预处理表中的字段进行对应,并利用所述每个数据项替换所述第一预处理表中对应字段所对应的空值; 按所述预设顺序获取与所述预处理表中每个字段对应的每个数据项。
4.根据权利要求3所述的方法,其特征在于,所述第一预处理表为第一哈希表。
5.根据权利要求1或2所述的方法,其特征在于,所述第一计数器的计数值和所述第一数据表的表名存储于第二哈希表中,所述第一缓冲区中缓冲的行数据和所述第一数据表的表名存储于第三哈希表中,所述第一读写锁的数据结构和所述第一数据表的表名存储于第四哈希表中; 所述方法还包括: 根据哈希算法获取与所述第一数据表的表名对应的第一计数器、第一缓冲区和第一读写锁。
6.一种向数据库插入数据的装置,其特征在于,所述数据库中的每个数据表与一个计数器、一个缓冲区和一个读写锁相互对应,所述装置包括: 行数据获取模块,用于获取需要向所述数据库的第一数据表插入的行数据,所述行数据中的每个数据项与所述第一数据表中的每个字段一一对应,所述第一数据表与第一计数器、第一缓冲区和第一读写锁相互对应; 数据处理模块,用于按照下述方式完成向数据库插入数据的操作: 使所述第一计数器累加一个计数,并将所述行数据放入所述第一缓冲区中;判断所述第一计数器中的计数值是否达到设定阈值;如果是,则使所述第一计数器中的计数值置为零,将所述第一缓冲区中缓冲的所有行数据放入所述第一数据表中,清除所述第一缓冲区中缓冲的所有行数据,继续执行所述获取需要向所述数据库的第一数据表插入的行数据的步骤;如果否,则继续执行所述获取需要向所述数据库的第一数据表插入的行数据的步骤;其中,在至少一次的所述第一读写锁的访问控制期间完成上述操作中的读写操作,所述第一读写锁的访问控制期间是从开启所述第一读写锁后到关闭所述第一读写锁前的期间。
7.根据权利要求6所述的装置,其特征在于,所述数据处理模块,具体包括: 第一处理子模块,用于在第一次开启所述第一读写锁的写模式后、且在第一次关闭所述第一读写锁的写模式前,使所述第一计数器累加一个计数,并将所述行数据放入所述第一缓冲区中; 阈值判断子模块,用于判断所述第一计数器中的计数值是否达到设定阈值; 第二处理子模块,用于在所述阈值判断子模块判断得到的所述第一计数器中的计数值达到设定阈值时,在第二次开启所述第一读写锁的写模式后、且在第二次关闭所述第一读写锁的写模式前,使所述第一计数器中的计数值置为零;在开启所述第一读写锁的读模式后、且在关闭所述第一读写锁的读模式前,将所述第一缓冲区中缓冲的所有行数据放入所述第一数据表中;在第三次开启所述第一读写锁的写模式后、且在第三次关闭所述第一读写锁的写模式前,清除所述第一缓冲区中缓冲的所有行数据;继续执行所述获取需要向所述数据库的第一数据表插入的行数据的步骤; 第三处理子模块,用于在所述阈值判断子模块判断得到的所述第一计数器中的计数值未达到设定阈值时,继续利用所述行数据获取模块执行所述获取需要向所述数据库的第一数据表插入的行数据的功能。
8.根据权利要求6或7所述的装置,其特征在于,所述第一数据表与第一预处理表相互对应,所述第一预处理表中按预设顺序存储了所述第一数据表中的每个字段,所述第一预处理表中每个字段对应的初始数据为空值; 所述行数据获取模块,具体包括: 数据替换子模块,用于将所述行数据中的每个数据项与所述第一预处理表中的字段进行对应,并利用所述每个数据项替换所述第一预处理表中对应字段所对应的空值; 行数据获取子模块,用于按所述预设顺序获取与所述预处理表中每个字段对应的每个数据项。
9.根据权利要求8所述的装置,其特征在于,所述第一预处理表为第一哈希表。
10.根据权利要求6或7所述的装置,其特征在于,所述第一计数器的计数值和所述第一数据表的表名存储于第二哈希表中,所述第一缓冲区中缓冲的行数据和所述第一数据表的表名存储于第三哈希表中,所述第一读写锁的数据结构和所述第一数据表的表名存储于第四哈希表中; 所述装置还包括: 对 应项获取模块,用于根据哈希算法获取与所述第一数据表的表名对应的第一计数器、第一缓冲区和第一读写锁。
【文档编号】G06F17/30GK103914565SQ201410160707
【公开日】2014年7月9日 申请日期:2014年4月21日 优先权日:2014年4月21日
【发明者】周星 申请人:北京搜狐新媒体信息技术有限公司