一种对数据库操作进行批处理的方法和装置的制造方法
【专利摘要】本发明实施例提供一种对数据库操作进行批处理的方法和装置,其中方法包括:收集数据库操作,并将数据库操作发送给内容提供者提供的applyBatch;通过applyBatch对数据库操作进行批处理;如果当前处理批次的数据库操作对数据库修改没有成功,则查找符合预设条件的分割点yield point,根据查找到的yield point将所述当前处理批次的数据库操作进行划分,并将划分后的数据库操作发送给applyBatch进行批处理,直到当前处理批次的数据库操作对数据库修改成功。本发明实施例能够在收集数据库操作集合applyBatch时,动态的查找到最佳的分区集合,既保证了安全,又保证了效率。
【专利说明】
一种对数据库操作进行批处理的方法和装置
技术领域
[0001]本发明实施例涉及数据处理技术领域,尤其涉及一种对数据库操作进行批处理的方法和装置。
【背景技术】
[0002]内容提供者(Contentprovider)是android的四大组件之一,它为存储和获取数据提供统一的接口,可以在不同的应用程序之间共享数据。
[0003]ContentPro vider将数据的访问方式统一,不必针对不同数据类型采取不同的访问策略,通常ContentProvider使用表的形式来组织数据,无论数据的来源是什么,ContentProvider都会默认为是一种表,然后把数据组织形成表格。
[0004]ContentProvider提供的数据库操作包括:
[0005]query 查询;
[0006]insert 插入;
[0007]update 更新;
[0008]delete 删除;
[0009]getType得到数据类型;
[0010]onCreate创建数据时调用的回调函数。
[0011 ] 使用 ContentProvider 的 applyBatch(String authority, Ar rayList<ContentProviderOperat 1n>operat 1ns)可以将多个数据库操作在一个事务中执行。
[0012]批处理applyBatch,用于把一批新增、修改、删除的请求放到一个transact 1n事务中,在一个transact1n事务向ContentProvider发送一批命令,节省了在处理数据库以及线程的上下文切换时间,使得数据库操作更快更高效。
[0013]对于批处理applyBatch,一批处理多少个数据项非常重要。如果设置的数量很小,效率不高,则没有充分减小上下文切换的损耗,但是如果设置的数量很大,则很可能发生Transact1nTooLargeExcept1n 的异常,导致任务失败。
[0014]Transact1nTooLargeExcept1n是由于传输的数据太大导致的异常,例如如果Binder的参数或返回值太大,不适合的事务缓冲区,然后调用将失败,并将被抛出Transact1nTooLargeExcept1nο
[0015]此外,因为批量操作一大堆数据可能会长期锁定数据库,从而阻止其他应用访问该数据库,有可能会引起应用程序无响应(ANR,Applicat1n Not Responding)对话框出现。
[0016]为了避免此错误,需要在批量操作中添加分割点(yield points) ,yield points告诉ContentProvider,在执行下一个操作之前可以先提交当前的数据,然后通知其他应用,如果有其他应用请求数据的话,就先让其他应用操作,等其他应用操作完成后,再继续执行下一个操作。如果没有其他程序请求数据,则yield points不会自动提交事务,而是继续执行下一个批量操作。
[0017]通常,ContentProvider要求每个yield points的操作不能多于500个,并且这批操作数据的也不能太大,例如最大通常限制为1M。也就是说,如果所有的数据大小加起来超过IM的话,是不行的,否则会出现transact1nTooLargeExcept1n的异常。
[0018]为了防止出现Transact1nTooLargeExcept 1n,在现有技术中通常采用一下的方法:
[0019]方法一:把数据库操作的个数设置为很小的一个定值。
[0020]但是,设置为很小的一个定值使得效率不高,很可能每一个数据库操作都比较小,应该设置更多的操作数量。
[0021]方法二:对数据操作循环累加判断,每次都判断是否溢出导致错误。
[0022]但是,循环操作中算数据库操作大小的时候浪费了时间。每个数据的大小都不一样,有的大,有的小,所以可能一个集合A有1个数据,一个集合B有20个数据,但是A的大小却比B大。
[0023]方法三:先用最大个数操作,一旦出现Transact1nTooLargeExcept1n,会把数据库操作集合根据yield points分开,再操作再分开,一直到不出错为止。有多少个yieldpoints操作就把集合切割成多少小集合。
[0024]但是,一旦出错,如果yieldpoints的操作很多,切割的小组数会非常多,每组又特别小,导致效率非常低。
【发明内容】
[0025]本发明实施例提供一种对数据库操作进行批处理的方法和装置,在收集数据库操作集合applyBatch时,动态的查找到最佳的分区集合,既保证了安全,又保证了效率。
[0026]本发明实施例提供一种对数据库操作进行批处理的方法,包括:
[0027]收集数据库操作,并将数据库操作发送给内容提供者提供的applyBatch;
[0028]通过applyBatch对数据库操作进行批处理;
[0029]如果当前处理批次的数据库操作对数据库修改没有成功,则查找符合预设条件的分割点yield point,根据查找到的yield point将所述当前处理批次的数据库操作进行划分,并将划分后的数据库操作发送给applyBatch进行批处理,直到当前处理批次的数据库操作对数据库修改成功。
[0030]本发明实施例提供一种用于批处理的终端,包括:
[0031 ]第一处理模块,用于收集数据库操作,并将数据库操作发送给内容提供者提供的applyBatch;
[0032]第二处理模块,用于通过applyBatch对数据库操作进行批处理;
[0033]第三处理模块,用于如果当前处理批次的数据库操作对数据库修改没有成功,则查找符合预设条件的分割点yield point,根据查找到的yield point将所述当前处理批次的数据库操作进行划分,并将划分后的数据库操作发送给applyBatch进行批处理,直到当前处理批次的数据库操作对数据库修改成功。
[0034]和现有技术相比,本发明实施例提供的对数据库操作进行批处理的方法和装置,在收集数据库操作提供给applyBatch进行批处理时,能够动态的根据数据的不同,找到最佳的yield point进行分区;不需要像现有技术中的靠取最小值来保证安全,也不需要累加每个数据的值来看是否会溢出。因此,采用本发明的方案对数据库操作进行批处理,既保证了安全,又保证了效率。
【附图说明】
[0035]为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0036]图1为本发明的一个具体实施例中对数据库操作进行批处理的方法的流程示意图;
[0037]图2为本发明的一个具体实施例中对数据库操作进行批处理的方法的详细流程示意图;
[0038]图3本发明的一个具体实施例中LeOperat1n的数据结构示意图;
[0039]图4为本发明的一个具体实施例中用于对数据库操作进行批处理的终端的结构示意图。
【具体实施方式】
[0040]为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0041]实施例一:
[0042]图1为本发明的一个具体实施例中对数据库操作进行批处理的方法的流程示意图。
[0043]如图1所示,本发明实施例的方法包括:
[0044]步骤Sll,收集数据库操作,并将数据库操作发送给内容提供者提供的applyBatch;
[0045]步骤S12,通过applyBatch对数据库操作进行批处理;
[0046]步骤S13,如果当前处理批次的数据库操作对数据库修改没有成功,则查找符合预设条件的yield point,根据查找到的yield point将当前处理批次的数据库操作进行划分,并将划分后的数据库操作发送给applyBatch进行批处理,直到当前处理批次的数据库操作对数据库修改成功。
[0047]实施例二:
[0048]图2为本发明的一个具体实施例中移动终端绑定服务的方法的详细流程示意图。
[0049]如图2所示,本发明实施例的方法包括:
[°05°]步骤S21,预先定义内容提供者提供的applyBatch的数据库操作类LeOperat1n。
[0051]在本步骤中,如图3所示,预先定义的LeOperat1n的数据结构示意图。
[0052]LeOperat1n包括内容提供者操作(ContentProviderOperat1n)、内容提供者操作创建(ContentProviderOperat1n.Builder)、列名(columnName)、偏移(offset)和布尔类型(Boolean),所述Boolean用于表示数据库操作是否位于yield point。
[0053]步骤S22,收集数据库操作,并将数据库操作发送给内容提供者提供的applyBatch。
[0054]在本步骤中,ContentProviderOperat1n.Bui Ider有一个很重要的方法withValueBackRef erence (String key, int prev1usResult),代表第prev1usResult 条批处理数据执行完成后,生成的索引值,将作为当前这条记录的key字段的值。
[0055]如果在数据库操作进行批处理的过程中,一旦出现transact1nTooLargeExcept1n,将当前批次的数据库操作进行分组,则可能导致prev1usResult 错误。
[0056]新定义的LeOperat 1n 的 co I umnName对应 withVa IueBackReference 中的 key,offset对应prev1usResult。将当前批次的数据库操作分组时,会重新计算off set的值。如果coIumnName为设定值,例如null或者‘,则!1136卩3作1:01'的130016311设置为1:1'116,认为该数据库操作是一个yield point。
[0057]步骤S23,判断当前批次的数据库操作对数据库修改是否成功,如果否,进行步骤S24;如果是,进行步骤S25。
[0058]步骤S24,如果对数据库修改没有成功,查找符合预设条件的yieldpoint,将当前处理批次的数据库操作进行划分,返回步骤S22。
[0059]在本步骤中,如果当前批次的数据库操作对数据库修改没有成功,则查找符合预设条件的yield point,将当前处理批次的数据库操作划分两组,并且将划分后的两组数据库操作发送给applyBatch进行批处理。
[0060]将当前处理批次的数据库操作进行划分具体为:从当前批次的数据库操作的中间向两边开始查找yield point,根据新定义的LeOperat1n,如果查找到LeOperat1n的columnName为设定值数的数据库操作,例如null或者,则该数据库操作是yield point。
[0061]将划分后的数据库操作发送给applyBatch。分批提交可能导致后面的操作的prev1usResult发生改变,所以要记录新批次首元素的位置L,那么新的prev1usResult为offset-L,调整好新的prev1usResult后执行内容提供者提供的prev1usResult。
[0062]步骤S25,如果对数据库修改成功,收集当前批次的数据库操作的处理结果。
[0063]实施例三:
[0064]图4为本发明的一个具体实施例中用于对数据库操作进行批处理的终端的结构示意图。
[0065]如图4所示,本发明实施例的终端包括:
[0066]第一处理模块41,用于收集数据库操作,并将数据库操作发送给内容提供者提供的applyBatch;
[0067]第二处理模块42,用于通过applyBatch对数据库操作进行批处理;
[0068]第三处理模块43,用于如果当前处理批次的数据库操作对数据库修改没有成功,则查找符合预设条件的yield point,将当前处理批次的数据库操作进行划分,并将划分后的数据库操作发送给applyBatch进行批处理,直到当前处理批次的数据库操作对数据库修改成功。
[0069]所述装置还包括:
[0070]第四处理模块,用于预先定义内容提供者提供的applyBatch的数据库操作类LeOperat1n,所述LeOperat1n包括内容提供者操作ContentProviderOperat1n、内容提供者操作创建 ContentProviderOperat 1n.Builder、列名columnName、偏移 off set 和布尔类型Boolean,其中所述Boolean用于表示数据库操作是否位于yield point。
[0071]此外,
[0072]所述第二处理模块还用于:
[0073]通过 ContentProviderOperat 1n.Bui Ider 的 withVa IueBackReference (Stringkey, int prev1usResult),在当前批次的第prev1usResult条数据库操作执行完成后,生成索引值,并将索引值作为当前记录的key字段的值;LeOperat1n的coIumnName对应withValueBackRef erence 中的key ,offset对应 prev1usResult,如果将当前批次的数据库操作分组时,重新计算offset。
[0074]所述第三处理模块具体用于:
[0075]如果当前处理批次的数据库操作对数据库修改没有成功,则从当前批次的数据库操作的中间向两边开始查找yield point,如果查找到LeOperat1n的columnName为设定值数的数据库操作,则所述数据库操作是yield point;根据查找到的yield point将所述当前处理批次的数据库操作划分两组;将划分后的两组数据库操作发送给applyBatch进行批处理,记录新批次首元素的位置L,则新批次中数据库操作的prev1usResult的off set为offset-L。
[0076]本发明实施例提供的对数据库操作进行批处理的方法和装置,在收集数据库操作提供给applyBatch进行批处理时,能够动态的根据数据的不同,找到最佳的yield point进行分区;不需要像现有技术中的靠取最小值来保证安全,也不需要累加每个数据的值来看是否会溢出。因此,采用本发明的方案对数据库操作进行批处理,既保证了安全,又保证了效率。
[0077]以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
[0078]通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如R0M/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
[0079]最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
【主权项】
1.一种对数据库操作进行批处理的方法,其特征在于,包括: 收集数据库操作,并将数据库操作发送给内容提供者提供的applyBatch; 通过applyBatch对数据库操作进行批处理; 如果当前处理批次的数据库操作对数据库修改没有成功,则查找符合预设条件的分割点yield point,根据查找到的yield point将所述当前处理批次的数据库操作进行划分,并将划分后的数据库操作发送给applyBatch进行批处理,直到当前处理批次的数据库操作对数据库修改成功。2.根据权利要求1所述的对数据库操作进行批处理的方法,其特征在于,所述方法还包括: 预先定义内容提供者提供的apply Batch的数据库操作类LeOperat1n,所述LeOperat1n包括内容提供者操作ContentProviderOperat1n、内容提供者操作创建ContentProviderOperat1n.Builder、列名columnName、偏移 off set和布尔类型 Boolean,其中所述Boolean用于表示数据库操作是否位于yield point。3.根据权利要求2所述的对数据库操作进行批处理的方法,其特征在于,所述方法还包括: ContentProviderOperat1n.Bui Ider 通过 wi thValueBackRef erence,在当前批次的第prev1usResult条数据库操作执行完成后,生成索引值,并将索引值作为当前记录的key字段的值; LeOperat 1n 的 co IumnName对应withVa IueBackReference 中的 key ,offset 对应prev1usResult,如果将当前批次的数据库操作分组时,重新计算off set。4.根据权利要求3所述的对数据库操作进行批处理的方法,其特征在于,所述查找符合预设条件的yield point,根据查找到的yield point将所述当前处理批次的数据库操作进行划分,并将划分后的数据库操作发送给applyBatch进行批处理的步骤包括: 从当前批次的数据库操作的中间向两边开始查找yield point,如果查找到LeOperat1n的columnName为设定值数的数据库操作,则所述数据库操作是yield point;根据查找到的yield point将所述当前处理批次的数据库操作划分两组,并将划分后的两组数据库操作发送给applyBatch进行批处理。5.根据权利要求4所述的对数据库操作进行批处理的方法,其特征在于,所述方法还包括: 将划分后的两组数据库操作发送给applyBatch进行批处理后,记录新批次首元素的位置L,则新批次中数据库操作的prev1usResult的off set为off set-L。6.根据权利要求2所述的对数据库操作进行批处理的方法,其特征在于,所述方法还包括: 如果对数据库修改成功,收集当前批次的数据库操作的处理结果。7.一种用于对数据库操作进行批处理的终端,其特征在于,包括: 第一处理模块,用于收集数据库操作,并将数据库操作发送给内容提供者提供的applyBatch; 第二处理模块,用于通过applyBatch对数据库操作进行批处理; 第三处理模块,用于如果当前处理批次的数据库操作对数据库修改没有成功,则查找符合预设条件的分割点yield point,根据查找到的yield point将所述当前处理批次的数据库操作进行划分,并将划分后的数据库操作发送给applyBatch进行批处理,直到当前处理批次的数据库操作对数据库修改成功。8.根据权利要求7所述的用于对数据库操作进行批处理的终端,其特征在于,所述装置还包括: 第四处理模块,用于预先定义内容提供者提供的applyBatch的数据库操作类LeOperat1n,所述LeOperat1n包括内容提供者操作ContentProviderOperat1n、内容提供者操作创建 ContentProviderOperat 1n.Builder、列名columnName、偏移 off set 和布尔类型Boolean,其中所述Boolean用于表示数据库操作是否位于yield point。9.根据权利要求8所述的用于对数据库操作进行批处理的终端,其特征在于,所述第二处理模块还用于: 通过 ContentProviderOperat1n.Bui Ider 的 withValueBackRef erence,在当前批次的第prev1usResult条数据库操作执行完成后,生成索引值,并将索引值作为当前记录的key字段的值; LeOperat 1n 的 co IumnName对应withVa IueBackReference 中的 key ,offset 对应prev1usResult,如果将当前批次的数据库操作分组时,重新计算off set。10.根据权利要求9所述的用于对数据库操作进行批处理的终端,其特征在于,所述第三处理模块具体用于: 如果当前处理批次的数据库操作对数据库修改没有成功,则从当前批次的数据库操作的中间向两边开始查找yield point,如果查找到LeOperat1n的columnName为设定值数的数据库操作,则所述数据库操作是yield point ; 根据查找到的yield point将所述当前处理批次的数据库操作划分两组; 将划分后的两组数据库操作发送给applyBatch进行批处理,记录新批次首元素的位置L,则新批次中数据库操作的prev1usResult的off set为off set-L。
【文档编号】G06F17/30GK105912541SQ201510921288
【公开日】2016年8月31日
【申请日】2015年12月12日
【发明人】江丹, 杨丹
【申请人】乐视移动智能信息技术(北京)有限公司