一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

数据处理方法、装置、电子设备及存储介质与流程

2022-06-02 03:46:49 来源:中国专利 TAG:


1.本技术涉及数据库技术领域,具体而言,本技术涉及一种数据处理方法、装置、电子设备及存储介质。


背景技术:

2.数据库中将接收到的select语句转化为关系算子(operator)组成的执行计划来执行结果。每个算子通过迭代的方式调用下层的算子拿到数据,然后经过该算子计算之后返回结果给上层算子。这种迭代模型被抽象成open()-next()-close()接口,其中open()负责初始化算子,next()执行数据,close()清理资源。
3.在实际情况中,close()接口经常被忘记调用。这样造成程序不少的缺陷,例如算子的线程被泄露、已经读取到但是还未被上层算子消费的数据所占用的内存也会泄漏。这种资源泄漏可能会导致数据库瘫痪。
4.另外如果忘记调用close()接口的情况下外部调用者重试这个查询计划,当再次运行open()和next()的时候还可能造成数据错误,这是数据库中的严重错误。
5.这种因忘记调用close()接口导致的错误在数据库使用过程中经常发生,造成的问题或者潜在问题也非常严重。


技术实现要素:

6.本技术实施例提供了一种数据处理方法、装置、电子设备、计算机可读存储介质及计算机程序产品,可以解决现有技术的上述问题。所述技术方案如下:
7.根据本技术实施例的一个方面,提供了一种数据处理方法,该方法包括:
8.获取执行计划树,所述执行计划树包括至少一个算子;
9.在迭代器中封装所述执行计划树的根节点的调用函数,所述根节点为所述执行计划树顶端的算子,所述调用函数包括第一close函数;
10.根据所述迭代器对应的编程语言提供的析构机制,将调用所述第一close函数整合至所述析构机制中,以使得在调用所述迭代器触发所述析构机制时,调用所述第一close函数。
11.作为一种可能的实现方式,当迭代器对应的编程语言为不具有垃圾回收功能的编程语言时,将调用所述第一close函数整合至所述析构机制中,包括:
12.将所述第一close函数写入所述迭代器的析构函数。
13.作为一种可能的实现方式,以使得在调用所述迭代器触发所述析构机制时,调用所述第一close函数,包括:
14.根据所述根节点构造迭代器对象,明确所述迭代器对象的作用域;
15.响应于所述迭代器对象退出所述作用域,执行所述析构函数,以调用所述第一close函数。
16.作为一种可能的实现方式,当迭代器对应的编程语言为具有垃圾回收功能的编程
语言时,将调用所述第一close函数整合至所述析构机制中,包括:
17.将调用所述第一close函数设置为所述迭代器的收尾操作。
18.作为一种可能的实现方式,以使得在调用所述迭代器触发所述析构机制时,调用所述第一close函数,包括:
19.响应于所述迭代器所在的数据库进程退出,触发垃圾回收,执行所述收尾操作,以调用所述第一close函数。
20.作为一种可能的实现方式,整合至所述析构机制中,包括:
21.由所述迭代器继承autocloseable类,重载所述autocloseable类的第二close函数。
22.作为一种可能的实现方式,以使得在调用所述迭代器触发所述析构机制时,调用所述第一close函数,包括:
23.根据所述根节点构造迭代器对象,明确所述迭代器对象的作用域;
24.响应于所述迭代器对象退出所述作用域,调用所述第二close函数,由所述第二close函数调用所述第一close函数。
25.根据本技术实施例的另一个方面,提供了一种数据处理装置,该装置包括:
26.计划树获取模块,用于获取执行计划树,所述执行计划树包括至少一个算子;
27.迭代器封装模块,用于在迭代器中封装所述执行计划树的根节点的调用函数,所述根节点为所述执行计划树顶端的算子,所述调用函数包括第一close函数;
28.整合模块,用于根据所述迭代器对应的编程语言提供的析构机制,将调用所述第一close函数整合至所述析构机制中,以使得在调用所述迭代器触发所述析构机制时,调用所述第一close函数。
29.作为一种可能的实现方式,整合模块具体用于:当迭代器对应的编程语言为不具有垃圾回收功能的编程语言时,将所述第一close函数写入所述迭代器的析构函数。
30.作为一种可能的实现方式,数据处理装置还包括:
31.第一对象构造模块,用于根据所述根节点构造迭代器对象,明确所述迭代器对象的作用域;
32.第一析构模块,用于响应于所述迭代器对象退出所述作用域,执行所述析构函数,以调用所述第一close函数
33.作为一种可能的实现方式,整合模块具体用于:当迭代器对应的编程语言为具有垃圾回收功能的编程语言时,将调用所述第一close函数设置为所述迭代器的收尾操作。
34.作为一种可能的实现方式,数据处理装置还包括:
35.收尾模块,用于响应于所述迭代器所在的数据库进程退出,触发垃圾回收,执行所述收尾操作,以调用所述第一close函数。
36.作为一种可能的实现方式,整合模块具体用于:当迭代器对应的编程语言为java编程语言时,由所述迭代器继承autocloseable类,重载所述autocloseable类的第二close函数。
37.作为一种可能的实现方式,数据处理装置还包括:
38.第二对象构造模块,用于根据所述根节点构造迭代器对象,明确所述迭代器对象的作用域;
指示该术语所限定的项目中的至少一个,例如“a和/或b”可以实现为“a”,或者实现为“b”,或者实现为“a和b”。
53.为使本技术的目的、技术方案和优点更加清楚,下面将结合附图对本技术实施方式作进一步地详细描述。
54.首先对本技术涉及的几个名词进行介绍和解释:
55.迭代器,又称为volcano执行模型,是一个在数据库中被广泛用于执行查询计划的模型。数据库中将接收到的select语句转化为关系算子(operator)组成的执行计划来执行结果。这些算子包括连接算子、聚集算子、选择算子、投影算子和扫描算子等。每个算子通过迭代的方式调用下层的算子拿到数据,然后经过该算子计算之后返回结果给上层算子。这种迭代模型被抽象成open()、next()和close()接口,执行相应的函数。具体来说,
56.1)open函数用于初始化本算子的一些结构,像初始化内存追踪器,启动工作线程和构建哈希表等;
57.2)next函数负责每次从下层算子获取一条或者一批数据,然后进行本算子的计算工作,例如执行过滤,投影或者插入哈希表等,接着返回给上层算子;next函数被调用多次,直到计算完所有数据;
58.3)close函数在next函数计算完成之后,释放所有资源和清理状态。
59.每个算子都实现上面的接口,迭代调用构成执行流。这种封装非常简洁,便于调用。最上层的调用程序只需要拿到执行计划的根节点,然后依次调用根节点的open(),next()和close()接口就能获得预期的结果。open()接口,close()接口只能调用一次,连续调用多次具有幂等性,而next()接口调用多次直到所有的结果都返回。
60.请参见图1,其示例性地示出了一个执行查询计划的执行流图,如图所述,该执行计划包括投影算子(projection)、选择算子(selection)和扫描算子(scan)。当外部调用拿到该执行计划的根节点:投影算子(projection),首先调用投影算子(projection)的open()接口,它会调用子节点选择算子(selection)的open()接口,接着选择算子再调用它的子节点扫描算子(scan)的open()接口。按照如此方式依次调用投影算子(projection)的next()和close()接口。不同的是next()接口会被调用n次,直到子节点不返回数据,也就是最后扫描算子完成所有数据扫描。
61.图1所示例子显示的是open()接口和next()接口都成功被调用的情况下的调用流程。当调用失败时,相应的流程如图2所示。如果open()接口调用失败,比如申请资源失败,那么外部调用必须调用close()接口来释放已经初始化的部分,不然造成资源泄漏或者重试该执行计划流程出错。对于next()接口过程也是如此,失败情况下也必须调用close()接口来清理中间状态。
62.比如图1的例子中,如果外部调用在调用next()接口时因出现错误而调用失败之后忘记调用close()接口,那么扫描算子中用于扫描数据的多个线程被泄漏,已经读取到但是还未被上层算子消费的数据所占用的内存也会泄漏。这种资源泄漏可能会导致数据库瘫痪。
63.另外,如果忘记调用close()接口的情况下外部调用者重试这个查询计划,当再次运行open()接口和next()接口的时候还可能造成数据错误,这是数据库中的严重错误。
64.因此需要从技术上提出一种新的迭代器模型从技术层面杜绝这个问题,让用户不
需要担心忘记调用close()问题,进一步解决的技术问题分为下面几个方面:
65.1、如何在原来的迭代器模型上实现这种智能,即不管open()接口next()接口调用成功与否,都会自动调用close()接口。
66.2、迭代器如何保证跟原来的迭代器功能兼容易用,保证不用大规模修改已有代码。
67.3、数据库可以有多种不同编程语言实现,如何保证多种语言通用性,平台独立。
68.4、如何保证迭代器高效、安全避免引入更多代价,并且不会导致更多资源泄漏等不安全的缺陷。
69.本技术提供的数据处理方法、装置、电子设备、计算机可读存储介质以及计算机程序产品,旨在解决现有技术的如上技术问题。
70.通过引入本技术实施例提供的迭代器(后续实施例也称之为智能迭代器),外部调用的调用流程可如图3所示,外部调用只需要调用open函数并且成功后调用next函数,其他情况都可以由智能迭代器自动调用,这里的其他情况包括了在next函数调用成功、open函数调用失败以及next函数调用失败三种情况。当然外部调用也可以调用所有流程,跟调用原来的迭代器的方式没有差别。这种流程相比较之前的图2的情况清晰表示可以避免忘记调用close函数的问题。
71.下面通过对几个示例性实施方式的描述,对本技术实施例的技术方案以及本技术的技术方案产生的技术效果进行说明。需要指出的是,下述实施方式之间可以相互参考、借鉴或结合,对于不同实施方式中相同的术语、相似的特征以及相似的实施步骤等,不再重复描述。
72.本技术实施例中提供了一种数据处理方法,如图4所示,该方法包括:
73.s101、获取执行计划树,所述执行计划树包括至少一个算子。
74.应当理解的是,执行计划树,即由执行计划中的各个算子构成的树形结构,以图1为例,图1中的投影算子、选择算子和扫描算子即可构成一个根节点为投影算子,子节点为选择算子,孙节点(子节点的子节点)为扫描算子的执行计划树。
75.s102、在迭代器中封装所述执行计划树的根节点的调用函数,所述根节点为所述执行计划树顶端的算子,所述调用函数包括第一close函数。
76.本技术实施例的迭代器在执行计划上进行封装,仅需要封装执行计划树的根节点的调用函数,可实现对执行计划树上其他算子的有序调用,应当理解的是,本技术实施例的调用函数包括了open函数、next函数以及close函数,其中根节点的close函数称之为第一close函数。
77.s103、根据所述迭代器对应的编程语言提供的析构机制,将调用所述第一close函数整合至所述析构机制中,以使得在调用所述迭代器触发所述析构机制时,调用所述第一close函数。
78.本技术实施例依赖于迭代器的编程语言所提供的析构机制,将第一close函数整合至析构机制中,从而当迭代器触发迭代机制时,调用迭代机制中整合的第一close函数。
79.本技术实施例的数据处理方法,通过获取执行计划树,所述执行计划树包括至少一个算子,在迭代器中封装所述执行计划树的根节点的调用函数,能够与现有的迭代器功能兼容易用,不需要大规模修改已有的代码,根节点为所述执行计划树顶端的算子,所述调
用函数包括第一close函数;根据所述迭代器对应的编程语言提供的析构机制,将调用所述第一close函数整合至所述析构机制中,以使得在调用所述迭代器触发所述析构机制时,调用所述第一close函数,实现了多语言通用性,并保证了不同平台间的独立,利用编程语言所提供的析构机制,可在触发析构机制时,自动调用第一close函数,外部调用按照调用原来的迭代器的方式调用智能迭代器,而不需要关注忘记close函数的调用问题,因为close函数最终都会在智能迭代器内部自动调用,从技术层面自动杜绝忘记调用close函数的问题。
80.在上述各实施例的基础上,作为一种可选实施例,当迭代器对应的编程语言为不具有垃圾回收功能(garbage collection,gc)的编程语言时,将调用所述第一close函数整合至所述析构机制中,包括:
81.将第一close函数写入迭代器的析构函数。
82.不带gc的程序语言包括c 语言,rust语言等。这类需要在编码的时候手动管理内存资源,对象的声明周期等。以c 语言为例,c 提供raii(resource acquisition is initialization)技术,即初始化中获取资源。每个对象离开{}作用域的时候会自动析构。基于这个机制,本技术实施例的智能迭代器是将执行计划的迭代器封装到一个对象中,并且对它的有效作用域用{}保护;一旦智能迭代器在有效作用域结束的时候,就会自动调用析构函数,从而自动调用close函数。
83.具体实现步骤如下:
84.(a)智能迭代器对外封装原始执行计划的open(),next()和close()接口,实现智能迭代器对调用者的透明;
85.(b)将根节点的第一close函数放到智能迭代器的析构函数中;
86.(c)具体使用的时候,外部调用将执行计划传递给智能迭代器,并生成智能迭代器的对象(而不是指针),并且对该对象的作用域用{}明确。
87.前两步主要实现对执行计划的封装,保持跟执行计划一样的接口,兼容已有代码。第三步就是按照raii的方式使用智能迭代器,即只需要调用智能迭代器的open函数、next函数就可以完成执行任务,而不需要关注调用close函数,因为close函数会自动调用。
88.在上述各实施例的基础上,作为一种可选实施例,以使得在调用所述迭代器触发所述析构机制时,调用所述第一close函数,包括:
89.根据所述根节点构造迭代器对象,明确所述迭代器对象的作用域;
90.响应于所述迭代器对象退出所述作用域,自动执行所述析构函数,以调用所述第一close函数。
91.当用这种语言实现智能迭代器的时候,close函数放到智能迭代器的析构函数中,同时对外封装原始执行计划的open(),next()和close()接口。
92.具体使用的时候,外部调用将执行计划传递给智能迭代器,并生成智能迭代器的对象(而不是指针),对该对象的作用域用{}明确。只需要调用智能迭代器的open函数、next函数就可以完成执行任务,而不需要关注调用close()。
93.下面结合一个具体的样例进行说明:
94.95.[0096][0097]
对上述代码进行分析,当next函数正常调用时,迭代器对象自然会退出作用域,此时会执行析构函数,调用第一close函数;当open函数调用失败(return 1)时,迭代器对象也会退出作用域,进而调用第一close函数,当next函数调用失败(return status)时,迭代器对象也会退出作用域,进而调用第一close函数,因此所有情况下都可以实现自动调用第一close函数。
[0098]
在上述各实施例的基础上,作为一种可选实施例,当迭代器对应的编程语言为具有垃圾回收功能的编程语言时,将调用所述第一close函数整合至所述析构机制中,包括:
[0099]
将调用所述第一close函数设置为所述迭代器的收尾操作。
[0100]
需要说明的是,具有gc功能的编程语言,包括golang,java等。这类语言自带的gc机制会自动回收不需要的内存,对象等资源,而不需要用户关注,这类语言中的对象也就没有自定义析构函数。但是这类语言提供了收尾(finalization)机制。利用该机制,用户可以定义一些特殊的操作,这些操作在一个对象将要被垃圾回收程序释放时执行。
[0101]
本技术实施例基于收尾机制,在生成迭代器的时候,将需要调用的close函数设置为迭代器的收尾操作。那么gc工作的时候,close函数就能真正被调用。具体实现步骤如下:
[0102]
(a)迭代器对外封装原始执行计划的open(),next()和close()接口,实现智能迭代器对调用者的透明;
[0103]
(b)将根节点的第一close函数设置为智能迭代器的收尾操作;
[0104]
(c)外部调用生成智能迭代器对象,并且调用迭代器的open、next函数就可以完成执行任务,而不需要关注调用close函数;
[0105]
(d)当智能迭代器所在的数据库进程退出之前,触发收尾机制,确保close函数完成调用。
[0106]
本技术实施例跟上述实施例的不带gc语言的实现步骤区别在于步骤b和d。这是因为带gc语言的自动回收机制不同,收尾机制需要设置收尾操作为close函数,并且在进程退出之前触发gc,确保close函数被调用。
[0107]
相应的,本技术实施例以使得在调用迭代器触发所述析构机制时,调用所述第一close函数,包括:
[0108]
响应于所述迭代器所在的数据库进程退出,触发垃圾回收,自动执行所述收尾操作,以调用所述第一close函数。
[0109]
下面结合一个具体的样例进行说明:
[0110]
golang语言没有类似c 的raii机制,只有defer和runtime.setfinalizer两种机制触发回收资源。考虑到defer还是需要编程人员在合适的位置写入defer close的语句,依然避免不了会忘记的情况。因此本技术实施例采用后者的方式(runtime.setfinalizer)提供自动析构功能。
[0111]
一种编程实现如下:
[0112]
[0113]
[0114][0115]
在上述各实施例的基础上,作为一种可选实施例,当迭代器对应的编程语言为java编程语言时,将调用所述第一close函数整合至所述析构机制中,包括:
[0116]
由所述迭代器继承autocloseable类,重载所述autocloseable类的第二close函数。
[0117]
需要说明的是,java提供类似于c 的raii功能,即让目标类继承autocloseable类并且重载该类的第二close函数(只是跟迭代器模型中的close()重名而已),使用目标类的时候按照try(myclass g=new myclass()){}限定作用域,当目标类的实例出作用域的时候会自动调用close()并且析构。
[0118]
那么本技术实施例实现迭代器就让该类继承autocloseable类,然后重载autocloseable的close函数,让其调用原来执行计划的close函数。接着按照try(){}的方式限定作用域。具体实现步骤参照不带gc语言的实现步骤。
[0119]
在上述各实施例的基础上,作为一种可选实施例,以使得在调用所述迭代器触发所述析构机制时,调用所述第一close函数,包括:
[0120]
根据所述根节点构造迭代器对象,明确所述迭代器对象的作用域;
[0121]
响应于所述迭代器对象退出所述作用域,自动调用第二close函数,由所述第二close函数调用所述第一close函数。
[0122]
下面结合一个具体的样例进行说明:
[0123]
java语言也提供收尾(finalization)机制,可以参照上面golang的实现版本。另外,根据java提供的类似于raii的功能的实现如下:
[0124]
[0125][0126]
本技术实施例从技术层面自动杜绝因为忘记调用迭代器模型中的close()而带来的资源泄漏或者数据错误的缺陷,提高数据库开发效率。并且智能迭代器依然提供原来的open(),next()和close()的接口,保证跟已有代码兼容,简单易用。智能迭代器仅仅依赖对象作用域规则,可以在不同语言中实现,平台独立。此外,本技术实施例的迭代器只是新增一个临时对象,代价极小。
[0127]
本技术实施例提供了一种数据处理装置,如图5所示,该数据处理装置可以包括:计划树获取模块101、迭代器封装模块102以及整合模块103,其中,
[0128]
计划树获取模块101,用于获取执行计划树,所述执行计划树包括至少一个算子;
[0129]
迭代器封装模块102,用于在迭代器中封装所述执行计划树的根节点的调用函数,所述根节点为所述执行计划树顶端的算子,所述调用函数包括第一close函数;
[0130]
整合模块103,用于根据所述迭代器对应的编程语言提供的析构机制,将调用所述第一close函数整合至所述析构机制中,以使得在调用所述迭代器触发所述析构机制时,自动调用所述第一close函数。
[0131]
本技术实施例的装置可执行本技术实施例所提供的方法,其实现原理相类似,本技术各实施例的装置中的各模块所执行的动作是与本技术各实施例的方法中的步骤相对应的,对于装置的各模块的详细功能描述具体可以参见前文中所示的对应方法中的描述,
integrated circuit,专用集成电路),fpga(field programmable gate array,现场可编程门阵列)或者其他可编程逻辑器件、晶体管逻辑器件、硬件部件或者其任意组合。其可以实现或执行结合本技术公开内容所描述的各种示例性的逻辑方框,模块和电路。处理器4001也可以是实现计算功能的组合,例如包含一个或多个微处理器组合,dsp和微处理器的组合等。
[0146]
总线4002可包括一通路,在上述组件之间传送信息。总线4002可以是pci(peripheral component interconnect,外设部件互连标准)总线或eisa(extended industry standard architecture,扩展工业标准结构)总线等。总线4002可以分为地址总线、数据总线、控制总线等。为便于表示,图6中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
[0147]
存储器4003可以是rom(read only memory,只读存储器)或可存储静态信息和指令的其他类型的静态存储设备,ram(random access memory,随机存取存储器)或者可存储信息和指令的其他类型的动态存储设备,也可以是eeprom(electrically erasable programmable read only memory,电可擦可编程只读存储器)、cd-rom(compact disc read only memory,只读光盘)或其他光盘存储、光碟存储(包括压缩光碟、激光碟、光碟、数字通用光碟、蓝光光碟等)、磁盘存储介质、其他磁存储设备、或者能够用于携带或存储计算机程序并能够由计算机读取的任何其他介质,在此不做限定。
[0148]
存储器4003用于存储执行本技术实施例的计算机程序,并由处理器4001来控制执行。处理器4001用于执行存储器4003中存储的计算机程序,以实现前述方法实施例所示的步骤。
[0149]
本技术实施例提供了一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时可实现前述方法实施例的步骤及相应内容。
[0150]
本技术实施例还提供了一种计算机程序产品,包括计算机程序,计算机程序被处理器执行时可实现前述方法实施例的步骤及相应内容。
[0151]
本技术的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”、“1”、“2”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本技术的实施例能够以除图示或文字描述以外的顺序实施。
[0152]
应该理解的是,虽然本技术实施例的流程图中通过箭头指示各个操作步骤,但是这些步骤的实施顺序并不受限于箭头所指示的顺序。除非本文中有明确的说明,否则在本技术实施例的一些实施场景中,各流程图中的实施步骤可以按照需求以其他的顺序执行。此外,各流程图中的部分或全部步骤基于实际的实施场景,可以包括多个子步骤或者多个阶段。这些子步骤或者阶段中的部分或全部可以在同一时刻被执行,这些子步骤或者阶段中的每个子步骤或者阶段也可以分别在不同的时刻被执行。在执行时刻不同的场景下,这些子步骤或者阶段的执行顺序可以根据需求灵活配置,本技术实施例对此不限制。
[0153]
以上所述仅是本技术部分实施场景的可选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本技术的方案技术构思的前提下,采用基于本技术技术思想的其他类似实施手段,同样属于本技术实施例的保护范畴。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献