一种数据导入方法、装置、设备及介质与流程

文档序号:33646715发布日期:2023-03-29 04:33阅读:80来源:国知局
一种数据导入方法、装置、设备及介质与流程

1.本发明涉及计算机技术领域,特别涉及一种数据导入方法、装置、设备及介质。


背景技术:

2.现阶段的数据导入大部分都是基于单线程模型来进行开发,这也就导致效率在根本上无法进行显著提升,并且在数据导入过程中可能由于系统突然崩溃而导致数据导入失败,剩下的数据无法再次进行导入,无法达到高可用的状态。java是一门面向对象的编程语言,不仅吸收了c++语言的各种优点,还摒弃了c++里难以理解的多继承、指针等概念,因此java语言具有功能强大和简单易用两个特征。java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。目前,基于java语言单线程的数据导入方案,导入任务开始后数据串行导入,不支持数据重试,在导入过程中发生异常时无法对数据进行重试恢复,单库单表进行查询与写入,导入效率低下,当有大量数据时耗时长,并且查询与写入效率低,在高并发情况下容易导致死锁,当导入发生异常时无法进行数据重试,容易导致数据丢失,在一些敏感数据下容易导致重大事故,造成大量损失,并且导入数据无法做到一制,在异常情况下容易导致数据库产生大量垃圾数据。
3.由上可见,如何提高数据导入的效率,增加数据导入的安全性,避免数据导入较多时出现故障情况,保证数据的一致性是本领域有待解决的问题。


技术实现要素:

4.有鉴于此,本发明的目的在于提供一种数据导入方法、装置、设备及介质,能够提高数据导入的效率,增加数据导入的安全性,避免数据导入较多时出现故障情况,保证数据的一致性。其具体方案如下:
5.第一方面,本技术公开了一种数据导入方法,包括:
6.获取数据导入请求和待导入数据,对所述待导入数据进行分片处理,以得到各分片数据;
7.将预设的事务置为开启状态,并利用多线程将各所述分片数据导入至本地的数据表;
8.执行事务提交操作,然后判断事务提交操作是否执行成功,若事务提交操作执行成功,则结束数据导入。
9.可选的,所述对所述待导入数据进行分片处理,以得到各分片数据,包括:
10.采用max(id)方法确定出各数据分片范围;
11.按照各所述数据分片范围对所述待导入数据进行分片处理,以得到各分片数据。
12.可选的,所述采用max(id)方法确定出各数据分片范围之后,还包括:
13.获取所有的数据分片范围,并将所述所有的数据分片范围保存至本地的分片表;
14.从本地的所有节点中确定出执行分片处理的执行节点,并从所述执行节点中确定
出起始执行节点,将所述起始执行节点保存至所述分片表。
15.可选的,所述利用多线程将各所述分片数据导入至本地的数据表,包括:
16.基于所述数据导入请求创建线程池,并从所述线程池中确定出各线程;
17.采用多线程批次导入的方式,并利用多线程的countdowmlatch、多线程的future以及所述线程池将各所述分片数据导入至本地的数据表。
18.可选的,所述判断事务提交操作是否执行成功之后,还包括:
19.若事务提交操作未执行成功,则生成用于表征事务提交操作未执行成功的执行任务记录;
20.将所述执行任务保存至本地的任务表。
21.可选的,所述的数据导入检测方法,还包括:
22.根据预设的事务提交重试执行周期创建定时任务;
23.记录所述执行任务保存时间,基于当前时间和所述执行任务保存时间确定出时间差,判断所述时间差是否等于所述事务提交重试执行周期,若所述时间差等于所述事务提交重试执行周期,则触发所述定时任务。
24.可选的,所述将所述执行任务记录保存至本地的任务表之后,还包括:
25.基于所述任务表中的所述执行任务记录生成告警信息;
26.按照预设的告警信息发送方式将所述告警信息发送至客户端。
27.第二方面,本技术公开了一种数据导入装置,包括:
28.数据分片模块,用于获取数据导入请求和待导入数据,对所述待导入数据进行分片处理,以得到各分片数据;
29.分片数据导入模块,用于将预设的事务置为开启状态,并利用多线程将各所述分片数据导入至本地的数据表;
30.判断模块,用于执行事务提交操作,然后判断事务提交操作是否执行成功,若事务提交操作执行成功,则结束数据导入。
31.第三方面,本技术公开了一种电子设备,包括:
32.存储器,用于保存计算机程序;
33.处理器,用于执行所述计算机程序,以实现前述的数据导入方法。
34.第四方面,本技术公开了一种计算机存储介质,用于保存计算机程序;其中,所述计算机程序被处理器执行时实现前述公开的数据导入方法的步骤。
35.可见,本技术提供了一种数据导入方法,包括获取数据导入请求和待导入数据,对所述待导入数据进行分片处理,以得到各分片数据;将预设的事务置为开启状态,并利用多线程将各所述分片数据导入至本地的数据表;执行事务提交操作,然后判断事务提交操作是否执行成功,若事务提交操作执行成功,则结束数据导入。本技术通过对数据进行分片处理,提高了程序的可扩展性和稳定性,数据批量异步处理,增加了程序执行的效率,并且对失败部分的分片数据可以做到最小程度止损以及针对这部分分片数据进行数据重试恢复,并且本技术为提高程序异步执行效率,对线程进行手动控制来达成协作的目的,采用分库分表,将表结构的设计以及分表设计读写分离,提高数据库最大承载量,在高并发的情况下可以极大的提高系统负载率和查询效率,同时可以高效的避免死锁的产生。规避风险在偶尔的机器宕机,网络波动等情况出现时,仍能够实现数据一致。
附图说明
36.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
37.图1为本技术公开的一种数据导入检测方法流程图;
38.图2为本技术公开的一种数据导入检测方法流程图;
39.图3为本技术公开的一种数据导入检测方法的具体流程图;
40.图4为本技术公开的一种数据导入检测装置结构示意图;
41.图5为本技术提供的一种电子设备结构图。
具体实施方式
42.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
43.现阶段的数据导入大部分都是基于单线程模型来进行开发,这也就导致效率在根本上无法进行显著提升,并且在数据导入过程中可能由于系统突然崩溃而导致数据导入失败,剩下的数据无法再次进行导入,无法达到高可用的状态。java是一门面向对象的编程语言,不仅吸收了c++语言的各种优点,还摒弃了c++里难以理解的多继承、指针等概念,因此java语言具有功能强大和简单易用两个特征。java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。目前,基于java语言单线程的数据导入方案,导入任务开始后数据串行导入,不支持数据重试,在导入过程中发生异常时无法对数据进行重试恢复,单库单表进行查询与写入,导入效率低下,当有大量数据时耗时长,并且查询与写入效率低,在高并发情况下容易导致死锁,当导入发生异常时无法进行数据重试,容易导致数据丢失,在一些敏感数据下容易导致重大事故,造成大量损失,并且导入数据无法做到一制,在异常情况下容易导致数据库产生大量垃圾数据。由上可见,如何提高数据导入的效率,增加数据导入的安全性,避免数据导入较多时出现故障情况,保证数据的一致性是本领域有待解决的问题。
44.本技术中的线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。分库分表是指将关系型数据库进行横向或纵向拆分,如将数据库的某张表进行拆分成读库和写库,读库负者查询操作,写库负者写入操作,这样查询与写入在物理层面上进行了隔离,在高并发的情况下可以极大的提高系统负载率和查询效率,同时可以高效的避免死锁的产生。
45.参见图1所示,本发明实施例公开了一种数据导入检测方法,具体可以包括:
46.步骤s11:获取数据导入请求和待导入数据,对所述待导入数据进行分片处理,以得到各分片数据。
47.本实施例中,在获取数据导入请求和待导入数据之后,采用max(id)方法确定出各数据分片范围,然后获取所有的数据分片范围,并将所述所有的数据分片范围保存至本地的分片表,从本地的所有节点中确定出执行分片处理的执行节点,并从所述执行节点中确定出起始执行节点,将所述起始执行节点保存至所述分片表,然后按照各所述数据分片范围对所述待导入数据进行分片处理,以得到各分片数据。
48.本技术为了在高并发的情况下可以极大的提高系统负载率和查询效率,同时可以高效的避免死锁的产生,应用了分库分表的方法,分库分表是指将关系型数据库进行横向或纵向拆分,如将数据库的某张表进行拆分成读库和写库,读库负者查询操作,写库负者写入操作,这样查询与写入在物理层面上进行了隔离,本技术主要由四张表构成,分别是:point(数据表),主要是用来存储导入的数据;记录表:该表用于记录增量数据导入;step(分片表):该表用于记录分片范围和多线程执行分片的各个起点;task(任务表):该表用来记录导入任务相关信息。对数据表进行分表操作,拆分成读表与写表,读表负责查询,写表负责写入。
49.以point表为例,对数据进行分片,具体方式为采用max(id)/定义范围进行循环计算范围,取point表的id最大值按照每个范围区间进行取余预算,然后id从0开始,进行区间+,例如区间为1000则数据为:0-1000,1000-2000,2000-3000最后一位的数字如果有余数则多加1,通过利用事务来保护task和step表的范围数据一致性,因为这个是导入的基础,如果一个发生失败则等待下次重试,即同一个分片下的数据是在同一个事务中,不同的事务采用不同的线程进行执行,当某个事务执行失败时会记录下失败的节点范围,并重启线程对其进行再次的导入操作,由于是同一个事务,可以保证数据的一致性,不会产生垃圾数据。
50.步骤s12:将预设的事务置为开启状态,并利用多线程将各所述分片数据导入至本地的数据表。
51.本实施例中,将预设的事务置为开启状态之后,基于所述数据导入请求创建线程池,并从所述线程池中确定出各线程,然后采用多线程批次导入的方式,并利用多线程的countdowmlatch、多线程的future以及所述线程池将各所述分片数据导入至本地的数据表。
52.本实施例中,利用批次导入,在多线程的情况下会比单线程导入数据更加快速,提升性能大概10倍左右,利用多线程的countdowmlatch、多线程的future以及线程池来进行分片数据导入,通过线程之间协作来将性能最大化,从而保证系统的高性能。
53.步骤s13:执行事务提交操作,然后判断事务提交操作是否执行成功,若事务提交操作执行成功,则结束数据导入。
54.本实施例中,通过对数据进行分片处理,提高了程序的可扩展性和稳定性,数据批量异步处理,增加了程序执行的效率,并且对失败部分的分片数据可以做到最小程度止损以及针对这部分分片数据进行数据重试恢复,并且利用分库分表,表结构的设计以及分表设计,读写分离,提高数据库最大承载量,采用线程协作,为提高程序异步执行效率,对线程
进行手动控制来达成协作的目的,此外,利用了手动事务,在需要插入的数据中进行手动事务,利用事务的原子性、一致性、隔离性、持久性来实现数据一致性。
55.本实施例中,获取数据导入请求和待导入数据,对所述待导入数据进行分片处理,以得到各分片数据;将预设的事务置为开启状态,并利用多线程将各所述分片数据导入至本地的数据表;执行事务提交操作,然后判断事务提交操作是否执行成功,若事务提交操作执行成功,则结束数据导入。本技术通过对数据进行分片处理,提高了程序的可扩展性和稳定性,数据批量异步处理,增加了程序执行的效率,并且对失败部分的分片数据可以做到最小程度止损以及针对这部分分片数据进行数据重试恢复,并且本技术为提高程序异步执行效率,对线程进行手动控制来达成协作的目的,采用分库分表,将表结构的设计以及分表设计读写分离,提高数据库最大承载量,在高并发的情况下可以极大的提高系统负载率和查询效率,同时可以高效的避免死锁的产生。规避风险在偶尔的机器宕机,网络波动等情况出现时,仍能够实现数据一致。
56.参见图2所示,本发明实施例公开了一种数据导入检测方法,具体可以包括:
57.步骤s21:获取数据导入请求和待导入数据,对所述待导入数据进行分片处理,以得到各分片数据。
58.步骤s22:将预设的事务置为开启状态,并利用多线程将各所述分片数据导入至本地的数据表。
59.步骤s23:执行事务提交操作,然后判断事务提交操作是否执行成功,若事务提交操作执行成功,则结束数据导入。
60.步骤s24:若事务提交操作未执行成功,则生成用于表征事务提交操作未执行成功的执行任务记录,然后将所述执行任务保存至本地的任务表,基于所述任务表中的所述执行任务记录生成告警信息,按照预设的告警信息发送方式将所述告警信息发送至客户端。
61.本实施例中,还包括:根据预设的事务提交重试执行周期创建定时任务;记录所述执行任务保存时间,基于当前时间和所述执行任务保存时间确定出时间差,判断所述时间差是否等于所述事务提交重试执行周期,若所述时间差等于所述事务提交重试执行周期,则触发所述定时任务。
62.本实施例中,若一个数据导入失败则等待下次重试,即同一个分片下的数据是在同一个事务中,不同的事务采用不同的线程进行执行,当某个事务执行失败时会记录下失败的节点范围,并重启线程对其进行再次的导入操作,由于是同一个事务,可以保证数据的一致性,不会产生垃圾数据。通过重试机制,可以每次定时任务查询的为未开始和发生错误的数据,那么无论多少次数据都是可以不断的去查询去重试,任务结束后,又发生错误的数据会继续重试,但是只会重试当前批次,利用step里面得范围数据来将错误范围降低到最小,实现高可用。
63.本技术的具体流程如图3所示,用户发送数据导入请求和待导入数据,然后当获取数据导入请求和待导入数据时,进入数据导入流程,首先为创建线程池:根据数据导入请求创建线程池,并从线程池中确定出各线程,采用多线程批次导入的方式,并利用多线程的countdowmlatch、多线程的future以及所述线程池将各所述分片数据导入至本地的数据表,其次为数据分片流程:对所述待导入数据进行分片处理,以得到各分片数据,然后为开启事务流程:将预设的事务置为开启状态,并利用多线程将各所述分片数据导入至本地的
数据表,然后执行事务提交操作,判断事务提交操作是否执行成功,若事务提交操作执行成功,则结束数据导入,若事务提交操作未执行成功,则生成用于表征事务提交操作未执行成功的执行任务记录,将所述执行任务保存至本地的任务表,然后进入数据报警流程:基于所述任务表中的所述执行任务记录生成告警信息,按照预设的告警信息发送方式将所述告警信息发送至客户端,此外,本技术会根据预设的事务提交重试执行周期创建定时任务,记录所述执行任务保存时间,基于当前时间和所述执行任务保存时间确定出时间差,判断所述时间差是否等于所述事务提交重试执行周期,若所述时间差等于所述事务提交重试执行周期,则触发所述定时任务,即从本地的任务表中获取未执行成功的分片数据,然后进行重试,无论多少次数据都是可以不断的去查询去重试,任务结束后,又发生错误的数据会继续重试,但是只会重试当前批次,通过step里面的数据分片范围来将错误范围降低到最小,重新将预设的事务置为开启状态,并重复执行上述步骤。
64.本实施例中,获取数据导入请求和待导入数据,对所述待导入数据进行分片处理,以得到各分片数据;将预设的事务置为开启状态,并利用多线程将各所述分片数据导入至本地的数据表;执行事务提交操作,然后判断事务提交操作是否执行成功,若事务提交操作执行成功,则结束数据导入。本技术通过对数据进行分片处理,提高了程序的可扩展性和稳定性,数据批量异步处理,增加了程序执行的效率,并且对失败部分的分片数据可以做到最小程度止损以及针对这部分分片数据进行数据重试恢复,并且本技术为提高程序异步执行效率,对线程进行手动控制来达成协作的目的,采用分库分表,将表结构的设计以及分表设计读写分离,提高数据库最大承载量,在高并发的情况下可以极大的提高系统负载率和查询效率,同时可以高效的避免死锁的产生。规避风险在偶尔的机器宕机,网络波动等情况出现时,仍能够实现数据一致。
65.参见图4所示,本发明实施例公开了一种数据导入检测装置,具体可以包括:
66.数据分片模块11,用于获取数据导入请求和待导入数据,对所述待导入数据进行分片处理,以得到各分片数据;
67.分片数据导入模块12,用于将预设的事务置为开启状态,并利用多线程将各所述分片数据导入至本地的数据表;
68.判断模块13,用于执行事务提交操作,然后判断事务提交操作是否执行成功,若事务提交操作执行成功,则结束数据导入。
69.本实施例中,获取数据导入请求和待导入数据,对所述待导入数据进行分片处理,以得到各分片数据;将预设的事务置为开启状态,并利用多线程将各所述分片数据导入至本地的数据表;执行事务提交操作,然后判断事务提交操作是否执行成功,若事务提交操作执行成功,则结束数据导入。本技术通过对数据进行分片处理,提高了程序的可扩展性和稳定性,数据批量异步处理,增加了程序执行的效率,并且对失败部分的分片数据可以做到最小程度止损以及针对这部分分片数据进行数据重试恢复,并且本技术为提高程序异步执行效率,对线程进行手动控制来达成协作的目的,采用分库分表,将表结构的设计以及分表设计读写分离,提高数据库最大承载量,在高并发的情况下可以极大的提高系统负载率和查询效率,同时可以高效的避免死锁的产生。规避风险在偶尔的机器宕机,网络波动等情况出现时,仍能够实现数据一致。
70.在一些具体实施例中,所述数据分片模块11,具体可以包括:
71.数据分片范围确定模块,用于采用max(id)方法确定出各数据分片范围;
72.数据分片模块,用于按照各所述数据分片范围对所述待导入数据进行分片处理,以得到各分片数据。
73.在一些具体实施例中,所述数据分片模块11,具体可以包括:
74.数据分片范围保存模块,用于获取所有的数据分片范围,并将所述所有的数据分片范围保存至本地的分片表;
75.起始执行节点保存模块,用于从本地的所有节点中确定出执行分片处理的执行节点,并从所述执行节点中确定出起始执行节点,将所述起始执行节点保存至所述分片表。
76.在一些具体实施例中,所述分片数据导入模块12,具体可以包括:
77.线程确定模块,用于基于所述数据导入请求创建线程池,并从所述线程池中确定出各线程;
78.分片数据导入模块,用于采用多线程批次导入的方式,并利用多线程的countdowmlatch、多线程的future以及所述线程池将各所述分片数据导入至本地的数据表。
79.在一些具体实施例中,所述判断模块13,具体可以包括:
80.执行任务记录生成模块,用于若事务提交操作未执行成功,则生成用于表征事务提交操作未执行成功的执行任务记录;
81.执行任务保存模块,用于将所述执行任务保存至本地的任务表。
82.在一些具体实施例中,所述判断模块13,具体可以包括:
83.定时任务创建模块,用于根据预设的事务提交重试执行周期创建定时任务;
84.判断模块,用于记录所述执行任务保存时间,基于当前时间和所述执行任务保存时间确定出时间差,判断所述时间差是否等于所述事务提交重试执行周期,若所述时间差等于所述事务提交重试执行周期,则触发所述定时任务。
85.在一些具体实施例中,所述判断模块13,具体可以包括:
86.告警信息生成模块,用于基于所述任务表中的所述执行任务记录生成告警信息;
87.告警信息发送模块,用于按照预设的告警信息发送方式将所述告警信息发送至客户端。
88.图5为本技术实施例提供的一种电子设备的结构示意图。该电子设备20,具体可以包括:至少一个处理器21、至少一个存储器22、电源23、通信接口24、输入输出接口25和通信总线26。其中,所述存储器22用于存储计算机程序,所述计算机程序由所述处理器21加载并执行,以实现前述任一实施例公开的由电子设备执行的数据导入检测方法中的相关步骤。
89.本实施例中,电源23用于为电子设备20上的各硬件设备提供工作电压;通信接口24能够为电子设备20创建与外界设备之间的数据传输通道,其所遵循的通信协议是能够适用于本技术技术方案的任意通信协议,在此不对其进行具体限定;输入输出接口25,用于获取外界输入数据或向外界输出数据,其具体的接口类型可以根据具体应用需要进行选取,在此不进行具体限定。
90.另外,存储器22作为资源存储的载体,可以是只读存储器、随机存储器、磁盘或者光盘等,其上所存储的资源包括操作系统221、计算机程序222及数据223等,存储方式可以是短暂存储或者永久存储。
91.其中,操作系统221用于管理与控制电子设备20上的各硬件设备以及计算机程序222,以实现处理器21对存储器22中数据223的运算与处理,其可以是windows、unix、linux等。计算机程序222除了包括能够用于完成前述任一实施例公开的由电子设备20执行的数据导入检测方法的计算机程序之外,还可以进一步包括能够用于完成其他特定工作的计算机程序。数据223除了可以包括数据导入检测设备接收到的由外部设备传输进来的数据,也可以包括由自身输入输出接口25采集到的数据等。
92.结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(ram)、内存、只读存储器(rom)、电可编程rom、电可擦除可编程rom、寄存器、硬盘、可移动磁盘、cd-rom、或技术领域内所公知的任意其它形式的存储介质中。
93.进一步的,本技术实施例还公开了一种计算机可读存储介质,所述存储介质中存储有计算机程序,所述计算机程序被处理器加载并执行时,实现前述任一实施例公开的数据导入检测方法步骤。
94.最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
95.以上对本发明所提供的一种数据导入检测方法、装置、设备及存储介质进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1