向数据库插入数据的方法、装置、设备和可读存储介质
文献发布时间:2023-06-19 09:35:27
技术领域
本公开涉及数据库技术领域,尤其涉及一种向数据库插入数据的方法、装置、设备和可读存储介质。
背景技术
随着物联网、第五代移动通信技术(5th generation mobile networks或5thgeneration wireless systems、5th-Generation,简称5G或5G技术)等新兴技术的发展,数据正以指数级速度增长,这使得传统的数据库技术越来越难以满足应用需求。
目前,利用开放数据库连接(Open Database Connectivity,简称ODBC)驱动组件实现向数据库中插入多个数据时,往往采用循环执行的方式,ODBC驱动组件每次根据插入数据中的一条数据形成插入语句报文,向数据库服务器发送该插入语句报文,数据库服务器执行插入操作以后,将执行结果发送给ODBC驱动组件,若执行结果为插入完成,则ODBC驱动组件继续发送下一行待插入数据。
这样,在对数据库批量插入数据时,插入操作耗时长。
发明内容
为了解决上述技术问题或者至少部分地解决上述技术问题,本公开提供了一种向数据库插入数据的方法、装置、设备和可读存储介质。
第一方面,本公开提供了一种向数据库插入数据的方法,包括:
按照预设阈值,对待插入数据进行划分,得到至少一个数据集,所述数据集中包含至少两条数据;
针对每个所述数据集,生成与所述数据集对应的结构化查询语言插入命令,其中,所述插入命令包含插入操作指令和所述数据集,所述插入命令用于指示服务器将所述数据集中的数据插入到数据库中;
向所述服务器发送所述插入命令。
可选的,所述针对每个所述数据集,生成与所述数据集对应的插入命令之前,还包括:
将所述待插入数据写入内存中;
所述针对每个所述数据集,生成与所述数据集对应的插入命令,包括:
针对每个所述数据集,从内存中读取所述数据集,生成与所述数据集对应的插入命令。
可选的,所述向所述服务器发送所述插入命令之后,还包括:
接收所述服务器发送的执行结果,所述执行结果用于指示所述服务器将所述数据集中的数据插入到所述数据库中是否成功;
若所述服务器将所述数据集中的数据插入到所述数据库中成功,发送下一个数据集对应的插入命令。
可选的,所述生成与所述数据集对应的插入命令之后,还包括:
若所述数据集中包含的数据的数量等于所述预设阈值,生成所述数据集对应的第一执行计划;
若所述数据集中包含的数据的数量小于所述预设阈值,生成所述数据集对应的第二执行计划;
向所述服务器发送数据集对应的执行计划,所述执行计划为第一执行计划或者第二执行计划。
第二方面,本公开提供一种向数据库插入数据的装置,包括:
得到模块,用于按照预设阈值,对待插入数据进行划分,得到至少一个数据集,所述数据集中包含至少两条数据;
生成模块,用于针对每个所述数据集,生成与所述数据集对应的插入命令,其中,所述插入命令包含插入操作指令和所述数据集,所述插入命令用于指示服务器将所述数据集中的数据插入到数据库中;
发送模块,用于向所述服务器发送所述插入命令。
可选的,所述装置还包括:
写入模块,用于将所述待插入数据写入内存中;
所述生成模块具体用于,针对每个所述数据集,从内存中读取所述数据集,生成与所述数据集对应的插入命令。
可选的,所述装置还包括:
接收模块,用于接收所述服务器发送的执行结果,所述执行结果用于指示所述服务器将所述数据集中的数据插入到所述数据库中是否成功;
所述发送模块还用于:若所述服务器将所述数据集中的数据插入到所述数据库中成功,发送下一个数据集对应的插入命令。
可选的,所述生成模块还包括:
若所述数据集中包含的数据的数量等于所述预设阈值,生成所述数据集对应的第一执行计划;
若所述数据集中包含的数据的数量小于所述预设阈值,生成所述数据集对应的第二执行计划;
所述发送模块还用于:向所述服务器发送数据集对应的执行计划,所述执行计划为第一执行计划或者第二执行计划。
第三方面,本公开提供一种向数据库插入数据的设备,包括:
存储器,用于存储处理器可执行指令的存储器;
处理器,用于在计算机程序被执行时,实现如上述第一方面所述的方法。
第四方面,本公开提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,所述计算机执行指令被处理器执行时用于实现如上述第一方面所述的向数据库插入数据的方法。
本公开实施例提供的技术方案与现有技术相比具有如下优点:
按照预设阈值,对待插入数据进行划分,得到至少一个数据集,数据集中包含至少两条数据,针对每个数据集,生成与数据集对应的插入命令,其中,插入命令包含插入操作指令和数据集,插入命令用于指示服务器将数据集中的数据插入到数据库中,向服务器发送插入命令。在向数据库批量插入数据时,实现了以数据集为单位进行发送并插入数据库,减少了消耗大量的发送资源和CPU资源,缩短了插入操作所用时间,提高了插入效率。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。
为了更清楚地说明本公开实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为一种数据库系统的结构示意图;
图2为一种SQL语句的结构示意图;
图3为本公开实施例提供的一种向数据库插入数据的方法的流程示意图;
图4为本公开提供的一种SQL语句的结构示意图;
图5为一种从内存中读取待插入数据的示意图;
图6为本公开实施例提供的另一种向数据库插入数据的方法的流程示意图;
图7为另一种从内存中读取待插入数据的示意图;
图8为本公开实施例提供的再一种向数据库插入数据的方法的流程示意图;
图9为本公开实施例提供的又一种向数据库插入数据的方法的流程示意图;
图10为本公开实施例提供的一种向数据库插入数据的装置的结构示意图;
图11为本公开实施例提供的一种向数据库插入数据的设备的结构示意图。
具体实施方式
为了能够更清楚地理解本公开的上述目的、特征和优点,下面将对本公开的方案进行进一步描述。需要说明的是,在不冲突的情况下,本公开的实施例及实施例中的特征可以相互组合。
在下面的描述中阐述了很多具体细节以便于充分理解本公开,但本公开还可以采用其他不同于在此描述的方式来实施;显然,说明书中的实施例只是本公开的一部分实施例,而不是全部的实施例。
首先对本发明所涉及的名词进行解释:
结构化查询语言(Structured Query Language,简称SQL),是指一一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
开放数据库连接ODBC:是指为解决异构数据库间的数据共享而产生的基于Windows环境的一种数据库访问接口标准,为异构数据库访问提供统一接口,允许应用程序以SQL为数据存取标准,存取不同数据库管理系统(DataBase Management System,简称DBMS)管理的数据;使应用程序直接操纵数据库中的数据,免除随数据库的改变而改变。
图1为一种数据库系统的结构示意图,如图1所示,数据库系统包括客户端和服务器,其中,客户端可以为一个或多个,客户端中可以运行应用程序和ODBC驱动。服务器可以为一个或多个,图1中示例性示出了3个服务器,分别为服务器1、服务器2和服务器3,可以理解,服务器的数量并不构成对本公开的限制,服务器中存储数据库数据。例如在异构数据库系统中,服务器可以承载不同类型的数据库。客户端中运行应用程序,使用ODBC驱动实现对数据库的访问。
在一些场景中,利用ODBC驱动组件实现向数据库中插入多个数据时,往往采用循环执行的方式,图2为一种SQL语句的结构示意图,应用程序生成的SQL语句的形式如图2所示,SQL语句包括指令和参数,其中,指令为插入操作指令,参数为待插入的数据,通过调用ODBC驱动实现与数据库的交互,ODBC驱动组件不会更改SQL语句,而是根据SQL语句,每次读取待插入数据中的一条数据(也是一行数据)形成插入命令报文,将该插入命令报文发送给数据库服务器,数据库服务器执行该条数据的插入操作以后,将执行结果发送给ODBC驱动,若执行结果为插入完成,则ODBC驱动组件继续发送下一条待插入数据。可以理解,在对数据库批量插入数据时,采用每次发送一条数据的方式,使得插入操作的过程耗时长,并且每一条数据都需要单独发送给服务器,需要消耗大量的发送资源、接收资源以及CPU资源,插入效率不高。
为解决上述技术问题,本公开提供一种向数据库插入数据的方法,按照预设阈值,对待插入数据进行划分,得到至少一个数据集,针对每个数据集,生成与数据集对应的插入命令,插入命令用于指示服务器将数据集中的数据插入到数据库中,向服务器发送插入命令。在向数据库批量插入数据时,实现了以数据集为单位进行发送并插入数据库,减少了发送资源、接收资源和CPU资源的消耗,缩短了插入操作所用时间,提高了插入效率。
下面以具体地实施例对本发明的技术方案以及本发明的技术方案如何解决上述技术问题进行详细说明。
图3为本公开实施例提供的一种向数据库插入数据的方法的流程示意图,如图3所示,本实施例的方法由客户端执行,本实施例的方法如下:
S301、按照预设阈值,对待插入数据进行划分,得到至少一个数据集。
其中,数据集中包含至少两条数据。
本实施例中,待插入数据为当前任务需要插入到数据库中的数据,即需要写入数据库中的数据,在需要向数据库插入数据的场景中,首先判断待插入数据的数量是否等于1,若待插入数据为1条,则按照现有方式处理即可,若待插入数据大于1条,则按照预设阈值,将待插入数据划分成数据集,其中,预设阈值用于表示对待插入数据进行划分时每个数据集中包含的数据数量,预设阈值可以为大于2的整数,例如预设阈值可以为100。每个数据集包含的数据的数量小于或者等于预设阈值,若待插入数据的数量小于或者等于预设阈值,则将待插入数据划分为一个数据集,该数据集中包含所有的待插入数据;若待插入数据的数量大于预设阈值,则将待插入数据划分为多个数据集,在划分为多个数据集时,除最后一个数据集以外的每个数据集包含的数据的数量为预设阈值,最后一个数据集包含的数据的数量小于或者等于预设阈值。
可选的,划分的数据集的数量P可以通过如下公式(1)和公式(2)得到:
x=n%BatchInsertSize公式(2);
其中,BatchInsertSize为预设阈值,n为待插入数据的数量,x为n对BatchInsertSize取余的值。
当待插入数据的数量n对预设阈值BatchInsertSize取余的值大于0时,划分的数据集的数量需要加1,该数据集中包含的数据的数量即为n对BatchInsertSize取余的值。
例如,预设阈值为100,假设待插入数据共有50条,则划分为一个包含该50条数据的数据集;假设待插入数据共有300条,则划分为3个数据集,每个数据集包含100条数据;假设待插入数据共有150条,则划分为2个数据集,一个数据集包含100条数据,另一个数据集包含50条数据。
S302、针对每个数据集,生成与数据集对应的插入命令。
其中,插入命令包含插入操作指令和数据集,插入命令用于指示服务器将数据集中的数据插入到数据库中。
针对划分的数据集中的每个数据集,生成与该数据集对应的插入命令,即一个数据集生成一条插入命令。
可选的,针对每个数据集,对数据集中每个数据对应的SQL语句进行拼接操作,得到数据集对应的SQL语句,根据数据集对应的SQL语句,得到数据集对应的插入命令,其中,拼接操作为将每个数据集包含的数据对应的SQL语句拼接为一条SQL语句,数据集对应的SQL语句包括指令和至少一个参数,参数数量与数据集中的数据数量相同。图4为本公开提供的一种SQL语句的结构示意图,如图4所示,对原SQL语句进行拼接操作,拼接后的SQL语句包括指令和m个参数,m为大于1的整数,m个参数包括参数1、参数2、……和参数m,m个参数中的每个参数对应一个待插入数据。将每个数据集包含的数据对应的SQL语句进行拼接的过程,可以理解,假设每页数据有a条数据,每条数据有b列,通过对SQL语句的拼接操作,将原来需要对数据库进行a行b列的操作,更改为对数据库进行a*b列的操作。然后根据每个数据集对应的SQL语句生成数据集对应的插入命令。
S303、向服务器发送SQL语句。
客户端分别向服务器发送每个数据集对应的SQL语句。
本实施例,按照预设阈值,对待插入数据进行划分,得到至少一个数据集,数据集中包含至少两条数据,针对每个数据集,生成与数据集对应的插入命令,其中,插入命令包含插入操作指令和数据集,插入命令用于指示服务器将数据集中的数据插入到数据库中,向服务器发送插入命令。在向数据库批量插入数据时,实现了以数据集为单位进行发送并插入数据库,减少了发送资源、接收资源和CPU资源的消耗,缩短了插入操作所用时间,提高了插入效率。
进一步地,在异构数据库中,数据库可能采用多种不同的数据结构,其执行的插入流程可能并不相同,因此若要缩短插入操作所用的时间,在数据库侧并不容易实现,本公开在无需改动不同数据库结构的服务器的插入流程的情况下,在客户端进行改进,更易于实现。
在一些场景中,待插入数据需要先写入内存中,ODBC驱动从内存中读取数据,和插入操作指令一起发送给数据库服务器,可以每次从内存中取一条数据,然后将插入操作指令和该数据发送给数据库,其中,可以一次性向内存中写入全部待插入数据,也可以设置写入阈值,按照写入阈值,将待插入数据分批写入内存中。图5为一种从内存中读取待插入数据的示意图,如图5所示,待发送数据共有n条数据,分别为数据1、数据2、数据3、数据4、数据5、数据6、数据7……数据n,可以将全部的待插入数据一次写入内存中,每次从内存中取一条数据,与插入操作指令一起组成插入命令,将插入命令发送给数据库,例如,先从内存中取出数据1,将数据1组成插入命令发送给数据库。
然而,这样使得每次只能发送一条数据,在待插入数据的数量很多的情况下,将消耗大量的发送资源、接收资源和CPU资源,插入操作所用时间长,插入效率不高。
下面以图6所示实施例进行详细说明本公开实施例如何解决如上技术问题。
图6为本公开实施例提供的另一种向数据库插入数据的方法的流程示意图,图6是在图3所示实施例的基础上,进一步地,如图6所示,S302之前还可以包括S302a,相应的,S302包括S302b:
S302a、将待插入数据写入内存中。
将待插入数据写入内存buffer中,一种可能的实现方式中,一次将全部待插入数据写入内存中,另一种可能的实现方式中,设置写入阈值,按照写入阈值,将待插入数据分批写入内存中,例如,设置写入阈值为200,则每次向内存中写入200条数据。
S302b、针对每个数据集,从内存中读取数据集,生成与数据集对应的插入命令。
按照数据集,每次从内存中读取数据集中的数据,然后生成与数据集对应的插入命令。图7为另一种从内存中读取待插入数据的示意图,如图7所示,待插入数据共有n个,将数据一次全部写入内存中,数据集中数据有m个,即m为数据集中包含的数据的行数,则可以一次从内存中读取m个数据,将m个数据进行拼接操作,作为参数与插入指令一起组成插入命令,发送给数据库服务器。
本实施例,通过将待插入数据写入内存中,并按照数据集从内存中读取数据,每次从内存中读取数据集的数据,从而实现以数据集为单位向服务器发送插入命令,减少了发送资源、接收资源和CPU资源的消耗,缩短了插入操作所用时间,提高了插入效率。
图8为本公开实施例提供的再一种向数据库插入数据的方法的流程示意图,图8是在图3或图6所示实施例的基础上,进一步地,如图8所示,S303之后还可以包括S304和S305:
S304、接收服务器发送的执行结果,执行结果用于指示服务器将数据集中的数据插入到数据库中是否成功。
客户端向服务器发送插入命令,服务器根据插入命令,将数据集插入到数据库中,插入操作完成后,得到执行结果,即此次将数据集中的数据插入到数据库中是否成功。服务器向客户端发送该执行结果。
S305、若服务器将数据集中的数据插入到数据库中成功,发送下一个数据集对应的插入命令。
若服务器将数据集中的数据插入到数据库中成功,发送下一个还未发送的数据集对应的插入命令。进一步地,若服务器将数据集中的数据插入到数据库中失败,则客户端发送下一个数据集对应的插入命令,或者,客户端重新向服务器发送该数据集对应的插入命令。通过重新向服务器发送该数据集对应的插入命令,可以实现数据的可靠传输。
本实施例,客户端接收服务器发送的执行结果,执行结果用于指示服务器将数据集中的数据插入到数据库中是否成功,若服务器将数据集中的数据插入到数据库中成功,发送下一个数据集对应的插入命令。以数据集为单位有序向服务器发送插入命令,减少了消耗大量的发送资源和CPU资源,缩短了插入操作所用时间,提高了插入效率。
在另一些场景中,客户端根据SQL语句中的插入操作指令生成数据集对应的执行计划,客户端将该执行计划发送给服务器,服务器可以按照执行计划执行相应的插入操作。可以理解,若执行的数据数量相同,则相应生成的执行计划也相同。下面以图9所示实施例进行详细说明。
图9为本公开实施例提供的又一种向数据库插入数据的方法的流程示意图,图9是在图3、图6或图8所示实施例的基础上,进一步地,如图9所示,S302之后还可以包括S302c、S302d和S302e:
S302c、若数据集中包含的数据的数量等于预设阈值,生成数据集对应的第一执行计划。
S302d、若数据集中包含的数据的数量小于预设阈值,生成数据集对应的第二执行计划。
将待插入数据划分成的数据集中包含的数据的数量小于或者等于预设阈值。
其中,一种可能的情况中,若数据集中包含的数据的数量等于预设阈值,生成数据集对应的第一执行计划,例如,数据集中包含的数据的数量等于预设阈值,可以是待插入数据的数量等于预设阈值,则待插入数据划分成一个数据集,该数据集中包含的数据为待插入数据;也可以是待插入数据的数量大于预设阈值,且能够整除预设阈值,则将待插入数据划分成多个数据集,该多个数据集中的每个数据集中包含的数据的数量等于预设阈值。可以理解,针对包含的数据的数量等于预设阈值的数据集,对应的执行计划相同,可以生成一个执行计划即可。
另一种可能的情况中,若数据集中包含的数据的数量小于预设阈值,生成数据集对应的第二执行计划。数据集中至多有一个数据集中包含的数据的数量小于预设阈值,例如,待插入数据的数量小于预设阈值,则将待插入数据划分成一个数据集,该数据集中包含的数据为待插入数据;待插入数据的数量大于预设阈值,且待插入数据的数量除以预设阈值时,有余数,则划分的数据集中的一个数据集中包含的数据的数量为该余数。
S302e、向服务器发送数据集对应的执行计划,执行计划为第一执行计划或者第二执行计划。
向服务器发送数据集对应的执行计划时,可以每次将数据集对应的执行计划发送给服务器,也可以将执行计划一起发送给服务器,其中,对于多个数据集对应第一执行计划的情况,可以只在第一次向服务器发送插入命令时,发送第一执行计划,即在待插入数据插入数据库的过程中,可以只发送一次第一执行计划。若划分成的数据集中,有数据集对应第一执行计划,也有数据集对应第二执行计划,可以在第一执行计划和第二执行计划分别发送给服务器,也可以将第一执行计划和第二执行计划一起发送给服务器。
相应的,服务器根据数据集中包含的数据的数量,使用对应的执行计划进行执行。例如,若待插入数据的数量能够整除预设阈值,即待插入数据的数量%预设阈值=0,则服务器只需要使用第一执行计划,在服务器执行过程中不需要更换执行计划;若待插入数据的数量不能整除预设阈值,即待插入数据的数量%预设阈值!=0,且只有一个数据集,则服务器只需要使用第二执行计划;若待插入数据的数量不能整除预设阈值,且数据集的数量大于1,服务器按照第一执行计划进行执行,将数据集中的数据插入数据库中,当数据集中包含的数据的数量小于预设阈值时,服务器将第一执行计划更换为第二执行计划,从而按照第二执行计划进行执行。
本实施例,若数据集中包含的数据的数量等于预设阈值,生成数据集对应的第一执行计划,若数据集中包含的数据的数量小于预设阈值,生成数据集对应的第二执行计划,向服务器发送数据集对应的执行计划,执行计划为第一执行计划或者第二执行计划,从而与现有技术相比,最多更换一次执行计划,更换执行计划所需的时间很短,因此,本实施例在服务器执行插入操作时,不会消耗过多的时间。
为进一步查看本公开的技术效果,可以通过如下测试来计算插入时间,并对比使用现有技术的插入方法和本公开实施例提供的插入方法的区别。
测试场景:在数据库中创建一张表,表中包含两个字段,一个数字类型,一个字符类型,向该表中插入5000条数据,并打印出执行时间;编写测试用例,该用例调用ODBC接口,向数据库中插入5000条数据;添加数据库连接配置项,配置1使用现有技术中的ODBC驱动,配置2使用本公开实施例提供的方法的ODBC驱动;通过执行调用不同配置的测试程序,分别统计出配置1的执行时间和配置2的执行时间,对配置1的执行时间和配置2的执行时间做比对。
通过上述测试发现,配置2的执行时间比配置1的执行时间减少了10倍左右,说明本公开实施例提供的一种向数据库插入数据的方法能够缩短插入时间,提高插入效率。
图10为本公开实施例提供的一种向数据库插入数据的装置的结构示意图,如图10所示,本实施例提供的装置包括:
得到模块101,用于按照预设阈值,对待插入数据进行划分,得到至少一个数据集,数据集中包含至少两条数据;
生成模块102,用于针对每个数据集,生成与数据集对应的插入命令,其中,插入命令包含插入操作指令和数据集,插入命令用于指示服务器将数据集中的数据插入到数据库中;
发送模块103,用于向服务器发送插入命令。
可选的,装置还包括:
写入模块,用于将待插入数据写入内存中;
生成模块102具体用于,针对每个数据集,从内存中读取数据集,生成与数据集对应的插入命令。
可选的,装置还包括:
接收模块,用于接收服务器发送的执行结果,执行结果用于指示服务器将数据集中的数据插入到数据库中是否成功;
发送模块103还用于:若服务器将数据集中的数据插入到数据库中成功,发送下一个数据集。
可选的,生成模块102还包括:
若数据集中包含的数据的数量等于预设阈值,生成数据集对应的第一执行计划;
若数据集中包含的数据的数量小于预设阈值,生成数据集对应的第二执行计划;
发送模块103还用于:向服务器发送数据集对应的执行计划,执行计划为第一执行计划或者第二执行计划。
上述实施例的装置,可以用于执行上述方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。
图11为本公开实施例提供的一种向数据库插入数据的设备的结构示意图,如图11所示,本实施例提供的设备包括:
存储器111,用于存储处理器可执行指令的存储器;
处理器112,用于在计算机程序被执行时,实现如上述图3、图6、图8、图9任一所示实施例的方法。
上述实施例的装置,可以用于执行上述方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。
本公开实施例提供一种计算机可读存储介质,计算机可读存储介质中存储有计算机执行指令,计算机执行指令被处理器执行时用于实现如上述图3、图6、图8、图9任一所示实施例的向数据库插入数据的方法。
需要说明的是,在本文中,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅是本公开的具体实施方式,使本领域技术人员能够理解或实现本公开。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本公开的精神或范围的情况下,在其它实施例中实现。因此,本公开将不会被限制于本文所述的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
- 向数据库插入数据的方法、装置、设备和可读存储介质
- 数据库双机热备方法、装置、设备及计算机可读存储介质