数据库和硬件之间的数据同步方法及装置与流程

文档序号:20949094发布日期:2020-06-02 20:02阅读:609来源:国知局
数据库和硬件之间的数据同步方法及装置与流程

本发明涉及计算机技术领域,尤其涉及一种数据库和硬件之间的数据同步方法及装置。



背景技术:

数据库,尤其是关系型数据库是当今各个行业存储,访问和处理大规模数据的主要技术。随着物联网、5g等新兴技术的发展,数据正以指数级速度增长,这使得传统的数据库技术越来越难以满足应用需求。

目前,加速传统关系型数据库的主要方式是使用内存数据库替代关系型数据库,它将关系型数据库的数据全部转化为列式存储的方式以加速数据处理速度,这种方法的缺陷在于内存数据库使用的内存是易失性的,一旦断电,内存上的数据将全部消失,而且设备内存大小有限,难以支撑大数据系统。其次,内存数据库的处理效率同样受限于通用处理器的性能。



技术实现要素:

本发明提供了一种数据库和硬件之间的数据同步方法及装置,以解决数据库和硬件的数据同步问题,从而解决数据库内存上数据容易丢失并会影响数据库处理效率的问题。

为了达到上述目的,本发明采用以下方案实现:

根据本发明实施例的一个方面,提供了一种数据库和硬件之间的数据同步方法,包括:

根据硬件所需读取表数据的表名获取所述硬件所需读取表数据的表大小相关信息;

根据所述表大小相关信息估算所述硬件所需读取表数据所需占用的空间大小;

根据所述所需占用的空间大小和数据库所在端的可用内存空间大小判断是否允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存;

在允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存的情况下,根据构造的全部读取的查询语句,将全部所述硬件所需读取表数据一次性从所述数据库读取至所述数据库所在端的内存,并将读取至所述数据库所在端的内存的全部所述硬件所需读取表数据传输至所述硬件。

在一些实施例中,所述的数据库和硬件之间的数据同步方法,还包括:在不允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存的情况下,根据构造的分次读取的查询语句,将所述硬件所需读取表数据以所述数据库所在端的内存允许的方式分多次从所述数据库读取至所述数据库所在端的内存,并将各次读取至所述数据库所在端的内存的所述硬件所需读取表数据依次传输至所述硬件。

在一些实施例中,根据硬件所需读取表数据的表名获取所述硬件所需读取表数据的表大小相关信息之前,所述的数据库和硬件之间的数据同步方法,还包括:建立所述数据库和所述硬件之间的连接,并基于所述连接从所述硬件获取所述硬件所需读取表数据的表名。

在一些实施例中,所述表大小相关信息包括行数、列数据类型、列数据长度及列数。

在一些实施例中,根据所述表大小相关信息估算所述硬件所需读取表数据所需占用的空间大小,包括:根据列数据类型和列数据长度估算一行中每列数据所占空间大小;根据列数对估算的一行中各列数据所占空间大小求和得到一行数据所占空间大小;将行数乘以求和得到的一行数据所占空间大小得到所述硬件所需读取表数据所需占用的空间大小。

在一些实施例中,根据所述所需占用的空间大小和数据库所在端的可用内存空间大小判断是否允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存,包括:通过判断所述所需占用的空间大小与数据库所在端的可用内存空间大小的比值是否小于或等于设定比值阈值,判断是否允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存。

在一些实施例中,根据所述所需占用的空间大小和数据库所在端的可用内存空间大小判断是否允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存,包括:通过判断所述所需占用的空间大小与数据库所在端的可用内存空间大小的比值是否小于或等于设定比值阈值,判断是否允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存。将所述硬件所需读取表数据以所述数据库所在端的内存允许的方式分多次从所述数据库读取至所述数据库所在端的内存之前,所述方法还包括:根据将所述所需占用的空间大小与数据库所在端的可用内存空间大小的比值向下取整加一得到的数值确定所分的次数。

在一些实施例中,在允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存的情况下,根据构造的全部读取的查询语句,将全部所述硬件所需读取表数据一次性从所述数据库读取至所述数据库所在端的内存,并将读取至所述数据库所在端的内存的全部所述硬件所需读取表数据传输至所述硬件,包括:在允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存的情况下,构造全部读取的查询语句;根据构造的全部读取的查询语句,将全部所述硬件所需读取表数据一次性从所述数据库读取至所述数据库所在端的内存,并将读取至所述数据库所在端的内存的全部所述硬件所需读取表数据传输至所述硬件。在不允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存的情况下,根据构造的分次读取的查询语句,将所述硬件所需读取表数据以所述数据库所在端的内存允许的方式分多次从所述数据库读取至所述数据库所在端的内存,并将各次读取至所述数据库所在端的内存的所述硬件所需读取表数据依次传输至所述硬件,包括:在不允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存的情况下,构造分次读取的查询语句;根据构造的分次读取的查询语句,将所述硬件所需读取表数据以所述数据库所在端的内存允许的方式分多次从所述数据库读取至所述数据库所在端的内存,并将各次读取至所述数据库所在端的内存的所述硬件所需读取表数据依次传输至所述硬件。

在一些实施例中,所述的数据库和硬件之间的数据同步方法,还包括:根据所述硬件基于传输至其的所需读取表数据得到的表数据的表名获取得到的表数据的表属性相关信息;根据基于所述表属性相关信息中的数据类型构造的插入语句将得到的表数据由所述硬件写入所述数据库。

在一些实施例中,根据基于所述表属性相关信息中的数据类型构造的插入语句将得到的表数据由所述硬件写入所述数据库,包括:基于所述表属性相关信息中的数据类型构造插入语句;根据构造的插入语句将得到的表数据由所述硬件写入所述数据库。

在一些实施例中,根据基于所述表属性相关信息中的数据类型构造的插入语句将得到的表数据由所述硬件写入所述数据库,包括:根据基于所述表属性相关信息中的数据类型构造的插入语句将得到的表数据由所述硬件按行写入所述数据库。

在一些实施例中,所述数据类型包括文本类型和数值类型。

在一些实施例中,根据所述硬件基于传输至其的所需读取表数据得到的表数据的表名获取得到的表数据的表属性相关信息之前,所述方法还包括:在所述数据库和所述硬件均创建用于存放所述硬件基于传输至其的所需读取表数据得到的表数据的表结构。

在一些实施例中,根据硬件所需读取表数据的表名获取所述硬件所需读取表数据的表大小相关信息,包括:使用odbcapi函数根据硬件所需读取表数据的表名获取所述硬件所需读取表数据的表大小相关信息。在允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存的情况下,根据构造的全部读取的查询语句,将全部所述硬件所需读取表数据一次性从所述数据库读取至所述数据库所在端的内存,并将读取至所述数据库所在端的内存的全部所述硬件所需读取表数据传输至所述硬件,包括:在允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存的情况下,通过odbc的sqlexecute函数执行根据构造的全部读取的查询语句,将全部所述硬件所需读取表数据一次性从所述数据库读取至所述数据库所在端的内存,并将读取至所述数据库所在端的内存的全部所述硬件所需读取表数据传输至所述硬件。根据所述硬件基于传输至其的所需读取表数据得到的表数据的表名获取得到的表数据的表属性相关信息,包括:使用odbcapi函数根据所述硬件基于传输至其的所需读取表数据得到的表数据的表名获取得到的表数据的表属性相关信息。根据基于所述表属性相关信息中的数据类型构造的插入语句将得到的表数据由所述硬件写入所述数据库,包括:使用odbcsqlexecute函数执行基于所述表属性相关信息中的数据类型构造的插入语句,以将得到的表数据由所述硬件写入所述数据库。

根据本发明实施例的另一个方面,提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述任一实施例所述方法的步骤。

根据本发明实施例的又一个方面,提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述任一实施例所述方法的步骤。

本发明实施例的数据库和硬件之间的数据同步方法、计算机设备及计算机可读存储介质,通过估算硬件所需读取表数据所需占用的空间大小,并在数据库端内存允许的情况下一次性传输表数据至硬件,以此能够实现主动预先读取数据,即实现读取数据的同步,而非在sql语句访问时才读取,以此能够尽可能避免在执行sql语句时丢失数据。通过实现硬件和数据库的数据同步能够有效利用硬件加速数据库,从而避免利用内存数据库处理数据,因此能够解决数据库内存上数据容易丢失并会影响数据库处理效率的问题。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。在附图中:

图1是本发明一实施例的数据库和硬件之间的数据同步方法的流程示意图;

图2是本发明一实施例中的数据库和硬件数据库的结构示意图;

图3是本发明一实施例中读取数据的流程示意图;

图4是本发明一实施例中写入数据的流程示意图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚明白,下面结合附图对本发明实施例做进一步详细说明。在此,本发明的示意性实施例及其说明用于解释本发明,但并不作为对本发明的限定。

需要预先说明的是,下述实施例或示例的描述或其中所提及的特征可以以相同或类似的方式,与其他实施例或示例中的特征组合,或替换其他实施例或示例中的特征,以形成可能的实施方式。另外,本文所使用的术语“包括/包含”是指特征、要素、步骤或组件的存在,但并不排除还存在一个或多个其他特征、要素、步骤或组件。

使用专门的硬件(如fpga(现场可编程门阵列),asic(专用集成电路)等)来加速数据库能够有效地避免现有技术存在的问题。作为一种协处理器,这类硬件通过大容量的存储和定制的计算单元来提高数据事务处理速度,本说明书将这类加速数据库的专用硬件称之为“硬件数据库”或“硬件”。尽管硬件数据库处理数据更高,但是它只能完成数据库最耗时的功能部分,因此仍然需要与运行在通用处理器上的传统数据库交互,这就需要解决数据和硬件的数据同步问题。

对此,本发明提供了一种数据库和硬件之间的数据同步方法及装置,以实现在数据库和硬件之间数据交互,从而便于利用硬件加速数据库,因而改善现有技术中在数据库内存上存储数据容易丢失以及影响数据库处理效率的问题。

图1是本发明一实施例的数据库和硬件之间的数据同步方法的流程示意图。如图1所示,该数据库和硬件之间的数据同步方法可包括以下步骤s110至步骤s140。需要预先说明的是,本说明书所述的数据库,又可称为软件数据库、传统数据库、cpu端数据库等,可以是mysql、oracle等;本说明书所述的硬件,又可称为硬件数据库、协处理器、硬件端数据库等,可以是fpga、asic等;数据库和硬件结合在一起可以形成数据库系统。

下面将对步骤s110至步骤s140的具体实施方式进行详细说明。

步骤s110:根据硬件所需读取表数据的表名获取所述硬件所需读取表数据的表大小相关信息。

硬件所需读取表数据可以是指利用硬件处理一件事务(可包括一条或多条sql语句)时所涉及的表数据(待处理表数据)。硬件可以通过硬件与数据库之间的接口(例如,pcie(周边设备高速连接标准)接口)从cpu端获得所需读取表数据的表名。进一步地,该表名可以由cpu端和应用程序之间的接口(例如odbc(开放数据库连接)接口)解析该事务的sql(结构化查询语言)语句得到。

硬件获取到所需读取表数据的表名可以通过硬件和数据库之间的连接提供给数据库。硬件和数据库之间的连接可以是已经存在的,或者可以是需要时构建的。

示例性地,该步骤s110之前,即,根据硬件所需读取表数据的表名获取所述硬件所需读取表数据的表大小相关信息之前,图1所示的方法还可包括步骤:s150,建立所述数据库和所述硬件之间的连接,并基于所述连接从所述硬件获取所述硬件所需读取表数据的表名。

该示例中,可以在需要获取表大小相关信息之前建立连接。可以利用odbcapi(开放数据库连接接口的应用程序接口)函数sqlconnect建立数据库和硬件之间的连接。建立连接后,硬件通过该连接提供表名给数据库。另外,该步骤s150中建立的连接不仅可以用于硬件从数据库读取数据,还可以用于硬件向数据库写入数据。

硬件所需读取表数据的表大小相关信息可以包括其中存放表数据所占空间大小相关的各种相关信息。例如,所述表大小相关信息可包括行数、列数据类型、列数据长度及列数中的一个或多个。其他实施例中,所述表大小相关信息可包括列数、行数据类型、行数据长度及行数中的一个或多个。

可以利用dobcapi函数,根据表明获取表行数、列数据类型和长度、列数等表相关信息。例如,利用sqlfetch函数移动表内“光标”来统计表行数,利用sqlnumresultcols函数获取表的列数,利用sqldescribecol函数得到列数据类型和列数据长度。

步骤s120:根据所述表大小相关信息估算所述硬件所需读取表数据所需占用的空间大小。

所述表大小相关信息包括行数、列数据类型、列数据长度及列数时,该步骤s120,即,根据所述表大小相关信息估算所述硬件所需读取表数据所需占用的空间大小,具体地,可包括步骤:s121,根据列数据类型和列数据长度估算一行中每列数据所占空间大小;s122,根据列数对估算的一行中各列数据所占空间大小求和得到一行数据所占空间大小;s123,将行数乘以求和得到的一行数据所占空间大小得到所述硬件所需读取表数据所需占用的空间大小。该步骤s122中,在一行中,不同列的数据所占存储空间的大小可不同,或者也可以相同。该步骤s123中,不同行的数据所占存储空间的大小可以相同,或者也可以不同。

该示例中,例如,硬件所需读取表数据所需占用的空间大小s估算为:

其中,r表示行数,k表示列序号,c表示列数,size(tk)表示一行中第k列表所占存储空间大小。

步骤s130:根据所述所需占用的空间大小和数据库所在端的可用内存空间大小判断是否允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存。

该步骤s130中,数据库所在端(如host端/cpu端)的可用内存空间大小可以通过在需要时检测得到,或者可以为设定值。可以通过直接比较所述所需占用的空间大小和数据库所在端的可用内存空间大小,或者,通过计算的比值、差值等,判断硬件所需读取表数据一次性读取至所述数据库所在端的内存。

示例性地,该步骤s130,即,根据所述所需占用的空间大小和数据库所在端的可用内存空间大小判断是否允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存,具体地,可包括步骤:s131,通过判断所述所需占用的空间大小与数据库所在端的可用内存空间大小的比值是否小于或等于设定比值阈值,判断是否允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存。

该步骤s131中,该设定比值阈值可以为1,当设定比值阈值小于1时可以认为内存空间不足以一次性读取所需表数据,当设定比值阈值大于或等于1时可以认为内存空间可以允许一次性读取所需表数据。该示例中,可以通过比值是否满足设定条件判断是否可以将所有所需表数据一次性读取到内存。

步骤s140:在允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存的情况下,根据构造的全部读取的查询语句,将全部所述硬件所需读取表数据一次性从所述数据库读取至所述数据库所在端的内存,并将读取至所述数据库所在端的内存的全部所述硬件所需读取表数据传输至所述硬件。

上述全部读取的查询语句可以预先或需要时构造,可以是sql语句。可以利用odbc执行该全部读取的查询语句来从数据库(如其磁盘)读取所需表数据。例如,该全部读取的查询语句可以为“select*from表”,其中“*”表示参数值,“表”表示表数据所来自的表(所涉及的表);然后,可以通过odbc的sqlexecute函数执行该查询语句“select*from表”来从数据库获取表数据。

另外,可以是将数据库的表数据先读取到内存,在从内存传输给硬件。示例性地,该步骤s140,具体地,可包括步骤:s141,在允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存的情况下,构造全部读取的查询语句;s142,根据构造的全部读取的查询语句,将全部所述硬件所需读取表数据一次性从所述数据库读取至所述数据库所在端的内存,并将读取至所述数据库所在端的内存的全部所述硬件所需读取表数据传输至所述硬件。

该步骤s141中,可以在需要时构造能够一次读取全部数据的查询语句。该步骤s142中,可以通过odbc的sqlexecute函数执行该查询语句,将数据库中的表数据从cpu端的磁盘读取到其内存,然后通过与硬件的连接传输给硬件。

在其他实施例中,若通过上述步骤s130判断无法允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存,则可以分次将硬件所需表数据读取至内存。示例性地,图1所示方法还可包括步骤:s160,在不允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存的情况下,根据构造的分次读取的查询语句,将所述硬件所需读取表数据以所述数据库所在端的内存允许的方式分多次从所述数据库读取至所述数据库所在端的内存,并将各次读取至所述数据库所在端的内存的所述硬件所需读取表数据依次传输至所述硬件。

该步骤s160中,分次读取的查询语句可以是预先构造的或者是在需要的时候构造的,可以是sql语句,可以通过odbc执行该sql语句。例如,用于获取400~500行表数据的分次读取的查询语句可以为“select*from(selectrownumasrn,*from表whererownum<=500)wherern>=400;”,通过odbcsqlexecute函数执行该分次读取的查询语句可以从数据库的表“*”的400~500行中选取参数值为*的表数据。

由于当前内存不足以存放所有硬件所需表数据,可以将该些硬件所需表数据分多次从数据库读取出来,每次读取的数据量可以相同或不同。每次将一部分表数据从数据库读取到内存后,可以待内存中的表数据传输至硬件后,再从数据库读取下一部分表数据。

在一些实施例中,上述步骤s120,即,根据所述所需占用的空间大小和数据库所在端的可用内存空间大小判断是否允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存,具体包括步骤:通过判断所述所需占用的空间大小与数据库所在端的可用内存空间大小的比值是否小于或等于设定比值阈值,判断是否允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存。在此情况下,上述步骤s160中,将所述硬件所需读取表数据以所述数据库所在端的内存允许的方式分多次从所述数据库读取至所述数据库所在端的内存之前,可以先确定分几次读取表数据,示例性地,图1所示的方法还可包括步骤:根据将所述所需占用的空间大小与数据库所在端的可用内存空间大小的比值向下取整加一得到的数值确定所分的次数。根据该步骤所得到的次数,可以据此将硬件所需表数据分次读取,每次读取的表数据的量可以为估算的所需占用的空间大小除以该次数,然后,根据每次读取的表数据的量确定每次读取的那部分表数据在表中的位置,以此可知每次从哪些表的位置读取表数据。

在一些实施例中,可以在将所述硬件所需读取表数据以所述数据库所在端的内存允许的方式分多次从所述数据库读取至所述数据库所在端的内存之前根据需求构造分次读取的查询语句。该步骤s160,即,在不允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存的情况下,根据构造的分次读取的查询语句,将所述硬件所需读取表数据以所述数据库所在端的内存允许的方式分多次从所述数据库读取至所述数据库所在端的内存,并将各次读取至所述数据库所在端的内存的所述硬件所需读取表数据依次传输至所述硬件,具体地,可包括步骤:s161,在不允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存的情况下,构造分次读取的查询语句;s162,根据构造的分次读取的查询语句,将所述硬件所需读取表数据以所述数据库所在端的内存允许的方式分多次从所述数据库读取至所述数据库所在端的内存,并将各次读取至所述数据库所在端的内存的所述硬件所需读取表数据依次传输至所述硬件。

该步骤s161中,可以根据次数确定每次读取的表数据的行数,然后根据每次读取的表数据的行数确定参数值,之后根据参数值构造分次读取的查询语句。例如,构造的分次读取的查询语句为“select*from(selectrownumasrn,*from表whererownum<=500)wherern>=400;”。本次可以读取100行表数据。

上述各实施例的数据库和硬件之间的数据同步方法说明了硬件从数据库读取数据时所涉及的数据同步方法。

另外,硬件在读取到其所需的表数据之后可以执行事务的指令,之后硬件可以将其执行结果返回至数据库。在此情况下,需要涉及硬件向数据库写入数据时的数据同步方法。

为此,在一些实施例中,图1所示的数据库和硬件之间的数据同步方法,还可包括步骤:

s170,根据所述硬件基于传输至其的所需读取表数据得到的表数据的表名获取得到的表数据的表属性相关信息;

s180,根据基于所述表属性相关信息中的数据类型构造的插入语句将得到的表数据由所述硬件写入所述数据库。

该步骤s170和步骤s180可在上述步骤s140之后执行,当然,若在上述步骤s110之前已有数据传输至硬件进行处理,则该步骤s170和步骤s180或类似步骤也可在其他可能的时机执行。

该步骤s170中,通过图1所示的方法使硬件接收到从数据库读取的该硬件所需读取表数据,硬件可以处理事务的指令(例如,进行数据查询的处理),从而可到基于传输至其的所需读取表数据的表数据,此时,硬件可通过硬件和数据库之间的连接将该表数据对应表的表名提供给数据库。

该表属性相关信息可指便于构造插入语句,使得将该表数据写入数据库的信息。该表属性相关信息包括数据类型的信息,其中,所述数据类型可包括文本类型和数值类型。对于不同的数据类型,可构造不同的插入语句,例如,对于文本类型(如varchar、timestamp、date等类型),需要在构造插入语句时给插入语句中的列值加上单引号,而对于数值类型(如number),则不需要给列值加上单引号。

该步骤s180中,该插入语句可以预先构造或需要时构造,可以为sql语句,可以使用odbcsqlexecute函数执行该插入语句,从而不断地写入表数据。数据库可以利用相应机制使得将硬件传输来的表数据一次性写入数据库。

在一些实施例中,上述步骤s180,即,根据基于所述表属性相关信息中的数据类型构造的插入语句将得到的表数据由所述硬件写入所述数据库,具体地,可包括步骤:s1811,基于所述表属性相关信息中的数据类型构造插入语句;s1812,根据构造的插入语句将得到的表数据由所述硬件写入所述数据库。该实施例中,可以在需要时构造插入语句。

在另一些实施例中,上述步骤s180,即,根据基于所述表属性相关信息中的数据类型构造的插入语句将得到的表数据由所述硬件写入所述数据库,具体地,可包括步骤:s1821,根据基于所述表属性相关信息中的数据类型构造的插入语句将得到的表数据由所述硬件按行写入所述数据库。该实施例中,按行写入数据。

在另一些实施例中,上述步骤s170之前,即,根据所述硬件基于传输至其的所需读取表数据得到的表数据的表名获取得到的表数据的表属性相关信息之前,上述实施例的方法还可包括步骤:在所述数据库和所述硬件均创建用于存放所述硬件基于传输至其的所需读取表数据得到的表数据的表结构。可以预先在硬件和数据库两端创建所需表结构,用于存放数据。

另外,上述步骤s140和步骤s160中,硬件从数据库读取数据时,若硬件需要表结构,也可以预先创建。

此外,本发明各实施例的方法可以基于odbc执行。

在一些实施例中,上述步骤s110,即,根据硬件所需读取表数据的表名获取所述硬件所需读取表数据的表大小相关信息,具体地可包括:使用odbcapi函数根据硬件所需读取表数据的表名获取所述硬件所需读取表数据的表大小相关信息。

在一些实施例中,可以利用odbcapi函数sqlconnect建立硬件与数据库的连接。该连接可以用于在二者间传输数据。

在一些实施例中,上述步骤s140,即,在允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存的情况下,根据构造的全部读取的查询语句,将全部所述硬件所需读取表数据一次性从所述数据库读取至所述数据库所在端的内存,并将读取至所述数据库所在端的内存的全部所述硬件所需读取表数据传输至所述硬件,包括:在允许将所述硬件所需读取表数据一次性读取至所述数据库所在端的内存的情况下,通过odbc的sqlexecute函数执行根据构造的全部读取的查询语句,将全部所述硬件所需读取表数据一次性从所述数据库读取至所述数据库所在端的内存,并将读取至所述数据库所在端的内存的全部所述硬件所需读取表数据传输至所述硬件。另外上述步骤s160中,也可以通过odbc的sqlexecute函数执行根据构造的分次读取的查询语句。

根据所述硬件基于传输至其的所需读取表数据得到的表数据的表名获取得到的表数据的表属性相关信息,包括:使用odbcapi函数根据所述硬件基于传输至其的所需读取表数据得到的表数据的表名获取得到的表数据的表属性相关信息。根据基于所述表属性相关信息中的数据类型构造的插入语句将得到的表数据由所述硬件写入所述数据库,包括:使用odbcsqlexecute函数执行基于所述表属性相关信息中的数据类型构造的插入语句,以将得到的表数据由所述硬件写入所述数据库。

基于与上述实施例所述方法相同的发明构思,本发明实施例还提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述任一实施例所述方法的步骤。该计算机设备可以是计算机、服务器等,或者可以是硬件设备,例如fpga、asic等。

另外,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述任一实施例所述方法的步骤。

为使本领域技术人员更好地了解本发明,下面将以具体实施例说明本发明的实施方式。

一具体实施例中,基于odbc(一种具有高效传输特点的数据库接口)提供了一种数据库和硬件数据库的交互方法。图2是本发明一实施例中的数据库和硬件数据库的结构示意图,其示出了数据库和硬件数据库的交互框架。如图2所示,数据库和硬件数据库的交互方式分为两种,硬件数据库向数据库请求/读取数据,以及硬件数据库想数据库写入数据。下面以oracle数据库为例,说明本实施例的具体实施方式。

如图3所示,硬件数据库向数据库读取数据的过程可包括以下步骤1~4。

1,使用odbcapi函数sqlconnect建立与数据库的连接,由硬件数据库提供要向数据库读取的表名。根据表名使用odbcapi函数获取表行数,列数据类型和长度,列数等表相关信息。

例如sqlfetch函数移动表内“光标”统计表行数r,sqlnumresultcols函数获取表列数c,sqldescribecol函数得到列数据类型t和长度l,则该表所占用的空间大小s粗略估计为:

2,获取当前host端可用内存空间,或者自行设定可用内存空间se,将表占用空间s和host端可用内存空间相比得到比值r,设定阈值rt(小于等于1),比较r和rt,如果r<rt,则执行步骤3,否则执行步骤4。

3,因为表占用空间小于要求的空间阈值,可以一次性读取到host端内存中,构造查询语句通过odbc从数据库中获取表的全部数据,传输给硬件数据库。一种可行的方式是构造语句”select*from表”,再通过odbc的sqlexecute函数执行查询语句获取表数据。

4,因为表占用空间大于要求的空间阈值,需要分次读取到host端内存中,需要的次数为r和rt的比值向下取整值加一。然后构造查询语句通过odbc从数据库中获取表的部分数据,依次传输给硬件数据库。一种可行的方式是构造语句”select*from(selectrownumasrn,*from表whererownum<=500)wherern>=400;”,上述语句获取400~500行的表数据,再通过odbc的sqlexecute函数执行查询语句获取表数据。

如图4所示,硬件数据库向数据库写入数据的过程可包括以下步骤1~3。

首先,默认所有表在创建时数据库和硬件数据库同时建立该表结构,因此当硬件数据库向数据库写入数据时,数据库拥有该表的表信息。

1,使用odbcapi函数sqlconnect建立与数据库的连接,由硬件数据库提供要写入的表名和表数据。根据表名使用dobcapi函数获取表列数据类型和长度等表相关信息。如使用sqldescribecol函数得到列数据类型t和长度l。

2,根据数据类型构造符合sql标准的插入语句。如构造sql语句"insertinto表values('value1','value2',value3);",当数据类型为varchar,timestamp,date等类型时,需要给列值加上单引号,而number等数值类型则不需要。

3,将硬件数据库的数据按行传入,将数据根据列类型赋值到插入语句中对应的列的值域(即value1等),使用odbcsqlexecute函数执行插入语句从而不断地写入表数据。

综上所述,本发明实施例的数据库和硬件之间的数据同步方法、计算机设备及计算机可读存储介质,通过估算硬件所需读取表数据所需占用的空间大小,并在数据库端内存允许的情况下一次性传输表数据至硬件,以此能够实现主动预先读取数据,即实现读取数据的同步,而非在sql语句访问时才读取,以此能够尽可能避免在执行sql语句时丢失数据。进一步地,在表数据超出可用内存的情况下,通过分次主动预先读取,能够避免出会因为内存不足而报错的问题。通过实现硬件和数据库的数据同步能够有效利用硬件加速数据库,从而避免利用内存数据库处理数据,因此能够解决数据库内存上数据容易丢失并会影响数据库处理效率的问题。

在本说明书的描述中,参考术语“一个实施例”、“一个具体实施例”、“一些实施例”、“例如”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。各实施例中涉及的步骤顺序用于示意性说明本发明的实施,其中的步骤顺序不作限定,可根据需要作适当调整。

本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1