一种把数据源文件中的数据导入到数据库中的方法
【专利摘要】本发明公开了一种把数据源文件中的数据导入到数据库中的方法,包括以下步骤:A.读取所述数据源文件中的数据;B.把所述数据逐行存入至原始数据队列中;C.设定多个数据处理入库线程;D.通过所述多个数据处理入库线程对所述原始数据队列中的数据进行预处理,并通过所述多个数据处理入库线程把所述预处理后的数据并行地写入到所述数据库中。本发明通过多线程实现数据并行导入,充分利用了硬件资源,从而提高存储效率,使得数据导入的速度大大提高。
【专利说明】一种把数据源文件中的数据导入到数据库中的方法
【技术领域】
[0001]本发明涉及数据存储领域,具体地,本发明涉及一种把数据源文件中的数据导入到数据库中的方法。
【背景技术】
[0002]随着应用系统数量的不断增长,大量的数据导入需求随之而生,而现有数据库(例如,INFORMIX,MYSQL等)仅提供简单的按顺序规则的导数工具,其效率和扩展性上不尽如人意。
[0003]目前各家银行所使用的数据库大多为INFORMIX数据库,其官方提供的常用数据导入方法有load和dbload两种,但这两种方法在数据处理方面都存在着很大的局限性:
[0004]首先,这两种方法的导入速度较慢。以100万行每行27列的数据文件为例:通过load方式把该数据文件导入到数据库中时,任何导入过程中的报错都会造成因数据量过大导致数据库锁资源耗尽而回滚。通过dbload方式把该数据文件导入到数据库中时,其需要耗时184440毫秒。
[0005]其次,这两种方法只能对文本文件实施线性读取导入。load和dbload由于是官方提供的工具,因此不可扩展,只能按每行的顺序线性地进行数据导入。
[0006]第三,这两种方法的错误输出格式不可自定义。load方法的出错信息被输出在屏幕上,并且一旦发生出错,整批数据均视为出错,程序不再继续处理数据导入。dbload虽然可以自定义错误日志名,但格式是固定的,无法实现自定义。
[0007]基于以上原因,急需一种具有较高存储效率的,并且能够克服上述缺陷的,数据导入方法,从而满足大数据量导入的需求。
【发明内容】
[0008]随着大数据时代的企业级应用系统,数据迁移或处理变得越发频繁,传统的数据导入方式已经不能满足现有的需求。千万级数据量的导入动辄需要花费几个小时,因此数据的导入效率亟待提高。鉴于此,本发明提供了一种把数据源文件中的数据导入到数据库中的方法。
[0009]本发明公开了一种把数据源文件中的数据导入到数据库中的方法,包括以下步骤:A.读取所述数据源文件中的数据;B.把所述数据逐行存入至原始数据队列中;C.设定多个数据处理入库线程;D.通过所述多个数据处理入库线程对所述原始数据队列中的数据进行预处理,并通过所述多个数据处理入库线程把所述预处理后的数据并行地写入到所述数据库中。
[0010]特别的,所述步骤D具体包括:a.各个所述数据处理入库线程分别从所述原始数据队列中读取预定数量的数据,并逐条进行预处理;b.各个所述数据处理入库线程分别把所述预处理后的数据存入至各自的预处理队列中;c.各个所述数据处理入库线程把所述预处理队列中的数据并行地写入到所述数据库中;d.各个所述数据处理入库线程清空所述预处理队列中的数据;e.各个所述数据处理入库线程分别确认所述原始数据队列中是否还有未处理过的数据:如果存在未处理过的数据,则执行步骤a。
[0011]特别的,在所述步骤c具体包括:1.依次从所述预处理队列中提取所述数据;I1.确认所述被提取的数据是否存在错误;当存在错误时,实施步骤:
[0012]v1.确定所述错误数据在所述预处理队列中的位置;
[0013]vi1.把所述位置之前的数据写入到所述数据库中;
[0014]vii1.把所述位置上的错误数据的对象信息写入到出错队列
[0015]中;
[0016]ix.在所述预处理队列中删除所述位置上和之前的数据;
[0017]X.执行步骤I ;
[0018]当不存在错误时:把提取的所述数据写入到所述数据库中。
[0019]特别的,所述对象信息包括:位置信息、内容、错误原因。
[0020]特别的,还包括步骤:通过出错处理线程来处理所述出错队列。
[0021 ] 特别的,根据用户定义的格式输出所述出错队列中的信息。
[0022]特别的,所述原始数据队列的深度和所述预处理队列的深度是可配置化的。
[0023]特别的,在步骤a中,基于所述预处理队列的深度来确定所述预定数量。
[0024]特别的,所述预处理队列的深度是50。
[0025]特别的,所述数据库是符合JDBC规范的数据库。
[0026]特别的,所述数据库是INFORMIX数据库或者MYSQL数据库。
[0027]综上所述,根据本发明所公开的方法具有如下优点:
[0028]I)本发明通过多线程实现数据并行导入,充分利用了硬件资源,从而提高存储效率,使得数据导入的速度大大提高。以100万行每行27列的数据文件为例,通过本发明所公开的方法完成数据导入仅需59473毫秒;
[0029]2)本发明可适用于所有符合JDBC规范的数据库,从而实现跨数据库统一的数据导入处理;
[0030]3)本发明可按需求个性化对每一行数据进行处理,摆脱数据库自带工具的逐列读取不可扩展的弊端;并且本发明可自定义输出结果,例如直接输出屏幕、保存文件、保存数据库等。
【专利附图】
【附图说明】
[0031]通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更加明显:
[0032]图1示出了根据本发明所公开的把数据源文件中的数据导入到数据库中的方法流程图;
[0033]图2示出了根据本发明所公开的把数据源文件中的数据导入到数据库中的过程示意图;
[0034]图3示出了根据本发明所公开的数据处理线程把预处理后的数据写入到数据库中的不意图;以及
[0035]图4示出了根据本发明所公开的处理数据导入出错的方法流程图。
【具体实施方式】
[0036]在以下优选的实施例的具体描述中,将参考构成本发明一部分的所附的附图。所附的附图通过示例的方式示出了能够实现本发明的特定的实施例。示例的实施例并不旨在穷尽根据本发明的所有实施例。可以理解,在不偏离本发明的范围的前提下,可以利用其他实施例,也可以进行结构性或者逻辑性的修改。因此,以下的具体描述并非限制性的,且本发明的范围由所附的权利要求所限定。
[0037]以下将结合附图1-4,说明一种把数据源文件中的数据导入到数据库中的方法。需要说明的是,尽管附图中以特定顺序描述了方法的步骤,但是这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果,相反,流程图中描绘的步骤可以改变执行顺序。附加地或备选地,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。
[0038]如图1、2所示,在步骤110中,文件读取模块中的文件读取线程210通过逐行读取的方式从数据源文件200中读取数据。其中,由于在此步骤中的文件读取速度远远大于在后续步骤中数据处理和存储的速度,因此本方案中只设定了一个文件读取线程用以读取数据源文件200中的数据。
[0039]在步骤120中,文件读取线程210把从数据源文件200中读取到的数据写入到同时启动的原始数据队列220中。该队列220的深度可以由用户自定义。在一个优选的实施例中,该原始数据队列220的深度可以是根据数据源文件和导入装置的硬件配置来决定的。当数据源文件较大和/或者导入装置的内存较大时,该原始数据队列220的深度可以设定的比较深。在一个具体的实施例中,该原始数据队列220的深度为5000,即:该原始数据队列可以保存5000条行数据。
[0040]当原始数据队列220中的数据被后续的线程(数据处理入库线程230)读取之后,该数据将被删除,并且文件读取线程210将从数据源文件200中获取新的数据放入至原始数据队列220中,该过程将被反复实施直至数据源文件200的数据被全部读取完毕。
[0041]在步骤130中,在批量入库模块中设定多个数据处理入库线程230,该多个数据处理入库线程230的功能都是相同的。该数据处理入库线程230用于从原始数据队列220中读取数据,并把数据在预处理后写入到数据库240中,该过程将被反复实施直至原始数据队列220中数据都被导入完毕。在本发明中,该数据库240是符合JDBC规范的数据库,例如:INFORMIX数据库或者MYSQL数据库。
[0042]参见图3,每个数据处理入库线程230中分别设有一个预处理队列330。由于数据处理入库线程230的处理速度较慢,因此预处理队列330的深度远小于原始数据队列220的深度。
[0043]在一个优选的实施例中,预处理队列330的深度和/或数据处理入库线程230的数量可以根据系统性能进行配置。例如,预处理队列330的深度和/或数据处理入库线程230的数量可以根据数据处理入库线程230的数据处理速度来设定。当数据处理入库线程230的数据处理速度较快时,预处理队列330的深度较深,数据处理入库线程230的数量较少;当数据处理入库线程230的数据处理速度较慢时,预处理队列330的深度较浅,数据处理入库线程230的数量较多。
[0044]需要指出的是步骤110和步骤130之间并没有特定的先后顺序,两者可以同时实施,也可以先后实施。
[0045]在步骤140中,各个数据处理入库线程230分别从原始数据队列220中读取预定数量的数据,并逐条进行预处理。其中,所述预定数量可以根据预处理队列330的深度来确定,在本实施例中所述预定数量等于预处理队列330的深度。所述预处理包括根据预处理接口把从原始数据队列220中读取的数据转化成所需要的格式。在本实施例中,所述预处理可以把数据拼装成JDBC中PreparedStatement所需要的参数列表。预处理后的数据将更加易于导入至JDBC数据库中。
[0046]在步骤150中,各个数据处理入库线程230分别把预处理后的数据存入至各自的预处理队列330中。并且当该预处理队列330满了之后,在步骤160中,数据处理入库线程230会把所述预处理队列中的数据写入到所述数据库240中。其中,多个数据处理入库线程230之间是并行地把预处理后的数据写入到数据库240中的,通过该并行写入的方式,数据处理和写入的时间得到了压缩,从而提高了数据导入的效率。
[0047]在步骤170中,当把各自预处理队列330中的数据导入到数据库240之后,数据处理入库线程230分别清空该预处理队列330中的数据。并且在步骤180中,数据处理入库线程230确认原始数据队列220中是否还有未处理过的数据:如果存在未处理过的数据,则重复执行步骤140至180,直至原始数据队列220中的数据全部被导入到数据库240中。
[0048]在步骤160中,当各个数据处理入库线程230把数据写入到数据库240中时,有时会发生写入出错的情况。对于该情况,图4示出了根据本发明所公开的处理数据导入出错的方法流程图,所述步骤160具体包括以下步骤:
[0049]在步骤161中,各个数据处理入库线程230会从各自的预处理队列330中提取已经预处理且需要被写入数据库240中的数据。
[0050]在步骤162中确认该数据是否存在错误。
[0051]当发现该被提取的数据存在错误时实施以下步骤:在步骤163中,确认该错误在预处理队列330中的位置;在步骤164中,把该位置之前的没有出错的数据写入到数据库240中;在步骤165中,把该出错数据的对象信息写入到出错队列340中,其中,该对象信息包括:位置信息(例如:该数据在数据源文件200中的行号,或者该错误数据在预处理队列330中的位置号)、内容、出错原因等任何与该错误数据相关的信息;在步骤166中,把已经记录过的数据清除,即:在预处理队列330中删除错误位置上和之前的数据。最后返回至步骤161中,以继续提取剩余的数据。
[0052]在一个具体的实施例中,该出错队列340由后续的出错处理线程进行处理,该处理方式包括:把所述对象信息写入到指定的文件、数据库或JMS中,或者根据用户定义的格式输出所述出错队列中的信息。
[0053]当发现该被提取的数据不存在错误时,则实施步骤167:把提取的数据写入到数据库240中。
[0054]最后,所述数据写入的结果和出错信息的结果可以通过自定义的方式输出,例如直接输出屏幕、保存文件、保存数据库等。
[0055]以下通过一个具体示例来说明数据处理入库线程对错误数据的处理:例如,在一个深度为50的预处理队列中,在队列中的第20个位置上的数据存在错误,则数据处理入库线程会从预处理队列中依次提取数据,当提取到第20个数据时,数据处理入库线程发现该数据存在错误,那么该线程会停止继续提取数据,而是把之前第1-19位置上的数据写入到数据库中,并把第20个位置上的数据的对象信息写入到出错队列,然后把第1-20个位置上的数据删除。之后数据处理入库线程从第21个位置上开始继续提取数据,直至所有数据提取完毕并写入到数据库中。
[0056]对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论如何来看,均应将实施例看作是示范性的,而且是非限制性的。此外,明显的,“包括”一词不排除其他元素和步骤,并且措辞“一个”不排除复数。装置权利要求中陈述的多个元件也可以由一个元件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。
【权利要求】
1.一种把数据源文件中的数据导入到数据库中的方法,包括以下步骤: A.读取所述数据源文件中的数据; B.把所述数据逐行存入至原始数据队列中; C.设定多个数据处理入库线程; D.通过所述多个数据处理入库线程对所述原始数据队列中的数据进行预处理,并通过所述多个数据处理入库线程把所述预处理后的数据并行地写入到所述数据库中。
2.根据权利要求1所述的方法,其中,所述步骤D具体包括: a.各个所述数据处理入库线程分别从所述原始数据队列中读取预定数量的数据,并逐条进行预处理; b.各个所述数据处理入库线程分别把所述预处理后的数据存入至各自的预处理队列中; c.各个所述数据处理入库线程把所述预处理队列中的数据并行地写入到所述数据库中; d.各个所述数据处理入库线程清空所述预处理队列中的数据; e.各个所述数据处理入库线程分别确认所述原始数据队列中是否还有未处理过的数据:如果存在未处理过的数据,则执行步骤a。
3.根据权利要求2所述的方法,其中,在所述步骤c具体包括: 1.依次从所述预处理队列中提取所述数据; I1.确认所述被提取的数据是否存在错误; 当存在错误时,实施步骤: 1.确定所述错误数据在所述预处理队列中的位置; ?.把所述位置之前的数据写入到所述数据库中; ii1.把所述位置上的错误数据的对象信息写入到出错队列中; iv.在所述预处理队列中删除所述位置上和之前的数据; V.执行步骤I ; 当不存在错误时:把提取的所述数据写入到所述数据库中。
4.根据权利要求3所述的方法,其中,所述对象信息包括:位置信息、内容、错误原因。
5.根据权利要求3所述的方法,其中,还包括步骤:通过出错处理线程来处理所述出错队列。
6.根据权利要求3所述的方法,其中,根据用户定义的格式输出所述出错队列中的信肩、O
7.根据权利要求3所述的方法,其中,所述原始数据队列的深度和所述预处理队列的深度是可配置化的。
8.根据权利要求7所述的方法,其中,在步骤a中,基于所述预处理队列的深度来确定所述预定数量。
9.根据权利要求7所述的方法,其中,所述预处理队列的深度是50。
10.根据权利要求3所述的方法,其特征在于,所述数据库是符合JDBC规范的数据库。
11.根据权利要求10所述的方法,其特征在于,所述数据库是INFORMIX数据库或者MYSQL数据库。
【文档编号】G06F17/30GK104376082SQ201410658208
【公开日】2015年2月25日 申请日期:2014年11月18日 优先权日:2014年11月18日
【发明者】王懋成, 刘迪, 吴文青 申请人:中国建设银行股份有限公司