神通数据库的包机制的实现方法转让专利

申请号 : CN201110033362.7

文献号 : CN102054050B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 谢卫平何清法顾云苏冯柯蒋志勇周丽霞尚博孙鹏胡秀龙彭贺

申请人 : 天津神舟通用数据技术有限公司

摘要 :

本发明涉及一种神通数据库的包机制的实现方法,包括包的创建方法、包的执行方法、包的编译方法和包的删除方法,通过包的创建、包的执行、包的编译和包的删除处理对包的系统表、包管理器和包实例进行管理,从而在神通数据库上实现包机制的功能。本发明实现了神通数据库与基于Oracle开发的应用程序的无缝对接功能,通过将复杂的应用逻辑转化为神通数据库服务器上的包,可以大大减少网络上数据的传输,降低应用开发的工作量,提高了神通数据库的执行效率。

权利要求 :

1.一种神通数据库的包机制的实现方法,其特征在于:包括包的创建方法、包的执行方法、包的编译方法和包的删除方法,所述的包的创建方法包括包头的创建方法和包体的创建方法,其中,包头的创建方法包括如下步骤:(1)语法解析模块对包头创建语句的解析;

(2)包头在关系系统表中的存储;

(3)包头源码在源码系统表中的存储;

(4)过程语言模块对包头声明部分的编译;

(5)包头对象在包变量系统表、包子程序系统表中的存储;

(6)包头依赖关系在依赖关系系统表中的存储;

(7)包管理器中新增包项目;

所述的包体的创建方法包括如下步骤:

(1)语法解析模块对包体创建语句的解析;

(2)检查包头是否编译;

(3)包体在关系系统表和包体源码在源码系统表中的存储;

(4)过程语言模块对包体的解析;

(5)包体对象在包变量系统表、包子程序系统表中的存储;

(6)包体对包头的依赖性检查;

(7)在包管理器中对应包项目增加包体信息;

所述的包的执行方法包括以下步骤:

(1)确定包和子程序的唯一标识号;

(2)获取包项目;

(3)获取包实例;

(4)调用包中的子程序的语法树;

(5)如果存在包的嵌套调用,则转到第(2)步重复执行;

(6)事物结束;

所述的包的编译方法是在包失效时对包进行重新编译的处理方法,包括以下步骤:(1)语法解析模块对包编译语句进行解析,如果编译语句为编译包体,则执行步骤(3)的包体编译步骤,否则执行步骤(2)的包头的编译步骤和步骤(3)的包体的编译步骤;

(2)包头的编译步骤:首先对包管理器加写锁;然后在源码系统表中获取包头源码,编译包头,重置包头对象在包变量系统表和包子程序系统表中的存储,重置包头在依赖关系系统表中的存储;重置包管理器中的包项目;即将包体的有效标识置为假,另外将依赖于该包的其他包的有效标识置为假;

(3)包体的编译步骤:首先对包管理器加写锁;然后从源码系统表中获取包体源码对包体进行编译,重置包变量系统表、包子程序系统表和依赖关系系统表中的存储;最后更新包项目中的包体编译信息,即将包体编译有效位置为真并更新时间戳,释放包管理器的写锁;

所述的包的删除方法包括以下步骤:

(1)语法解析模块对包删除语句进行解析,如果包删除语句为删除包体,则执行步骤(3)的包体的删除步骤;否则执行步骤(2)的包头删除和步骤(3)的包体的删除步骤;

(2)包头的删除步骤:首先对包管理器加写锁,删除包对应的包项目,并将引用此包的其他包的包头有效位置为假,释放包管理器的写锁;然后清除包头和包体在包变量系统表、源码系统表、关系系统表和依赖关系系统表中的记录;

(3)包体的删除步骤:对包管理器加写锁,将包项目中的包体的有效标识置为假,释放包管理器的写锁;然后清除包体在包变量系统表、源码系统表、关系系统表和依赖关系系统表中的记录。

2.根据权利要求1所述的神通数据库的包机制的实现方法,其特征在于:所述包的系统表包括关系系统表、源码系统表、依赖关系系统表、包变量系统表和包子程序系统表;该关系系统表存放包与表关系的唯一标识号、名称、关系类型和所属模式信息;该源码系统表按行存放包头和包体的源码,该源码系统表的字段含有包的唯一标识号、名称、包头和包体的区别标识、源码的行号和每行源码;该依赖关系系统表存放依赖与被依赖对象的唯一标识;该包变量系统表存放包的唯一标识号、全局变量名称、包头和包体的变量的区别标识;

该包子程序系统表存放包的子程序的唯一标识号、参数的数据类型、参数的输入和输出类型、参数名称、存储过程和函数的区别标识、子程序公有和私有区别标识、对应包的唯一标识号。

3.根据权利要求1所述的神通数据库的包机制的实现方法,其特征在于:所述的包管理器由多个包项目组成,每个包项目包括包的唯一标识号、包头和包体是否失效、包被置为有效时的时间戳、包头和包体的语法树、以及包中存储过程和函数的语法树,在包管理器上拥有一个读写锁。

4.根据权利要求1所述的神通数据库的包机制的实现方法,其特征在于:所述的包实例是在用户会话过程中建立的会话级的哈希表,该哈希表用于存放被使用的包的信息,该包实例所对应的包包括包的唯一标识号、包头声明的公有全局变量的拷贝、包体声明的私有全局变量的拷贝、以及包被置为有效时的时间戳的拷贝。

5.根据权利要求1所述的神通数据库的包机制的实现方法,其特征在于:所述的包失效的判断方法为:(1)包头和包体在被创建后并且未被引用之前,处于失效状态;

(2)包依赖的关系被删除或结构发生变化,对应的包头或包体失效;

(3)包头失效时,包体失效;调用它的子程序失效;

(4)包头被重新创建,包头失效;

(5)包体被重新创建,包体失效;

(6)包头被重新编译,包体失效;

(7)包头被删除,包头和包体失效;

(8)包体被删除,包体失效;

子程序被创建,引用失效包,包头变为有效,包体还是无效。

说明书 :

神通数据库的包机制的实现方法

技术领域

[0001] 本发明属于数据库应用技术领域,尤其是一种神通数据库的包机制的实现方法。

背景技术

[0002] Oracle数据库中的包是使用包名进行分组的PL/SQL语句块的集合,它含有存储过程、函数和全局变量等。使用包来绑定存储过程和函数具有如下优点:(1)良好设计的包是对象(如存储过程、函数、全局变量等)的逻辑分组,当第一次调用包时,所有的代码被加载到内存,即:第一次调用包的成本虽然较高,但是之后的调用处理性能会比较高,因此,在应用程序中使用包,能够比较经济地反复使用存储过程和函数;(2)使用包可以收集类似的存储过程和函数,并赋予公共的上下文,实现对它们的封装;(3)在包中可以创建私有的存储过程和函数,只能被相同包中的其他存储过程和函数调用,这样实现了信息隐藏。综上所述,Oracle包机制在数据库后台和网络传输上不仅提高了执行效率,而且信息隐藏的特点提高了数据库的安全性。但是,Oracle包机制的实现细节是不公开的。
[0003] 目前,神通数据库虽然也开发了自身的过程式SQL语言,但是和Oracle这样成熟的数据库相比,在功能完备性和执行效率方面存在一定差距,尤其是不支持包功能,使得基于Oracle开发的应用程序不能与神通数据库进行无缝对接,移植的工作量比较大;另外,基于神通数据库的复杂应用逻辑,仅仅使用存储过程和函数的效率没有使用包机制的效率高。

发明内容

[0004] 本发明的目的在于克服现有技术的不足,提供一种全面兼容Orac le PL/SQLPackage的神通数据库的包机制的实现方法,解决了神通数据库与基于Oracle开发的应用程序的无缝对接功能,提高了神通数据库的执行效率。
[0005] 本发明解决现有的技术问题是采取以下技术方案实现的:
[0006] 一种神通数据库的包机制的实现方法,包括包的创建方法、包的执行方法、包的编译方法和包的删除方法,通过包的创建、包的执行、包的编译和包的删除处理对包的系统表、包管理器和包实例进行管理,从而在神通数据库上实现包机制的功能。
[0007] 而且,所述包的系统表包括关系系统表、源码系统表、依赖关系系统表、包变量系统表和包子程序系统表;该关系系统表存放包与表关系的唯一标识号、名称、关系类型和所属模式信息;该源码系统表按行存放包头和包体的源码,该源码系统表得字段含有包的唯一标识号、名称、包头和包体的区别标识、源码的行号和每行源码;该依赖关系系统表存放依赖与被依赖对象的唯一标识;该包变量系统表存放包的唯一标识号、全局变量名称、包头和包体的变量的区别标识;该包子程序系统表存放包的子程序的唯一标识号、参数的数据类型、参数的输入和输出类型、参数名称、存储过程和函数的区别标识、子程序公有和私有区别标识、对应包的唯一标识号。
[0008] 而且,所述的包管理器由多个包项目组成,每个包项目包括包的唯一标识号、包头和包体是否失效、包被置为有效时的时间戳、包头和包体的语法树、以及包中存储过程和函数的语法树,在包管理器上拥有一个读写锁。
[0009] 而且,所述的包实例是在用户会话过程中建立的会话级的哈希表,该哈希表用于存放被使用的包的信息,该包实例所对应的包包括包的唯一标识号、包头声明的公有全局变量的拷贝、包体声明的私有全局变量的拷贝、以及包被置为有效时的时间戳的拷贝。
[0010] 而且,所述的包的创建方法包括包头的创建方法和包体的创建方法,其中,包头的创建方法包括如下步骤:
[0011] (1)语法解析模块对包头创建语句的解析;
[0012] (2)包头在关系系统表中的存储;
[0013] (3)包头源码在源码系统表中的存储;
[0014] (4)过程语言模块对包头声明部分的编译;
[0015] (5)包头对象在包变量系统表、包子程序系统表中的存储;
[0016] (6)包头依赖关系在依赖关系系统表中的存储;
[0017] (7)包管理器中新增包项目;
[0018] 所述的包体的创建方法包括如下步骤:
[0019] (1)语法解析模块对包体创建语句的解析;
[0020] (2)检查包头是否编译;
[0021] (3)包体在关系系统表和包体源码在源码系统表中的存储;
[0022] (4)过程语言模块对包体的解析;
[0023] (5)包体对象在包变量系统表、包子程序系统表中的存储;
[0024] (6)包体对包头的依赖性检查;
[0025] (7)在包管理器中对应包项目增加包体信息。
[0026] 而且,所述的包的执行方法包括以下步骤:
[0027] (1)确定包和子程序的唯一标识号;
[0028] (2)获取包项目;
[0029] (3)获取包实例;
[0030] (4)调用包中的子程序的语法树;
[0031] (5)如果存在包的嵌套调用,则转到第(2)步重复执行;
[0032] (6)事物结束。
[0033] 而且,所述的包的编译方法是在包失效时对包进行重新编译的处理方法,包括以下步骤:
[0034] (1)语法解析模块对包编译语句进行解析,如果编译语句为编译包体,则执行步骤(3)的包体编译步骤,否则执行步骤(2)的包头的编译步骤和步骤(3)的包体的编译步骤;
[0035] (2)包头的编译步骤:首先对包管理器加写锁;然后在源码系统表中获取包头源码,编译包头,重置包头对象在包变量系统表、包子程序系统表中的存储,重置包头在依赖关系系统表中的存储;重置包管理器中的包项目;即将包体的有效标识置为假,另外将依赖于该包的其他包的有效标识置为假;
[0036] (3)包体的编译步骤:首先对包管理器加写锁;然后从源码系统表中获取包体源码对包体进行编译,重置包变量系统表、包子程序系统表、依赖关系系统表中的存储;最后更新包项目中的包体编译信息,即将包体编译有效位置为真并更新时间戳,释放包管理器的写锁。
[0037] 而且,所述的包失效的判断方法为:
[0038] (1)包头和包体在被创建后并且未被引用之前,处于失效状态;
[0039] (2)包依赖的关系被删除或结构发生变化,对应的包头或包体失效;
[0040] (3)包头失效时,包体失效;调用它的子程序失效;
[0041] (4)包头被重新创建,包头失效;
[0042] (5)包体被重新创建,包体失效;
[0043] (6)包头被重新编译,包体失效;
[0044] (7)包头被删除,包头和包体失效;
[0045] (8)包体被删除,包体失效;
[0046] (9)子程序被创建,引用失效包,包头变为有效,包体还是无效。
[0047] 而且,所述的包的删除方法包括以下步骤:
[0048] (1)语法解析模块对包删除语句进行解析,如果包删除语句为删除包体,则执行步骤(3)的包体的删除步骤;否则执行步骤(2)的包头删除和步骤(3)的包体的删除步骤;
[0049] (2)包头的删除步骤:首先对包管理器加写锁,删除包对应的包项目,并将引用此包的其他包的包头有效位置为假,释放包管理器的写锁;然后清除包头和包体在包变量系统表、源码系统表、关系系统表和依赖关系系统表中的记录;
[0050] (3)包体的删除步骤:对包管理器加写锁,将包项目中的包体的有效标识置为假,释放包管理器的写锁;然后清除包体在包变量系统表、源码系统表、关系系统表和依赖关系系统表中的记录。
[0051] 本发明的优点和积极效果是:
[0052] 1、本发明通过包的创建、包的执行、包的编译和包的删除处理对包的系统表、包管理器和包实例进行管理,从而在神通数据库上实现包机制的功能,将复杂的应用逻辑中相关的方法或操作转换为存储过程或函数,将存储过程和函数共同操作的数据转化为全局变量,然后将这些存储过程、函数和全局变量组合成神通数据库的包,通过将复杂的应用逻辑转化为神通数据库服务器上的包,可以大大减少网络上数据的传输,降低应用开发的工作量。
[0053] 2、本发明通过包机制使得用户能够访问包中的存储过程、函数和全局变量,并可查看包头中存储过程、函数和全局变量的声明,但是隐藏了包体中它们的定义,提高了神通数据库的安全性。
[0054] 3、本发明通过包机制使得每个用户共享包中存储过程和函数的语法树,同时另有属于自己的全局变量的拷贝,从而即保证了包的操作的高效率,又保证了每个用户数据的独立性。

附图说明

[0055] 图1是包头的创建方法流程图;
[0056] 图2是包体的创建方法流程图;
[0057] 图3是包的执行方法流程图;
[0058] 图4是包的编译方法流程图;
[0059] 图5是包的删除方法流程图。

具体实施方式

[0060] 以下结合附图对本发明实施例做进一步详述。
[0061] 一种神通数据库的包机制的实现方法,包括包的创建方法、包的执行方法、包的编译方法和包的删除方法,通过包的创建、包的执行、包的编译和包的删除处理对包的系统表、包管理器和包实例进行管理,从而在神通数据库上实现包机制的功能。
[0062] 包的系统表用来存放与包有关的信息,包括:关系系统表、源码系统表、依赖关系系统表、包变量系统表和包子程序系统表。其中:关系系统表存放包、表等关系的唯一标识号、名称、关系类型、所属模式等信息;源码系统表按行存放包头和包体的源码,其字段有包的唯一标识号、名称、包头和包体的区别标识、源码的行号和每行源码;依赖关系系统表存放依赖与被依赖对象的唯一标识;包变量系统表存放包的唯一标识号、全局变量名称、包头和包体的变量的区别标识;包子程序系统表存放包的子程序的唯一标识号、参数的数据类型、参数的输入和输出类型、参数名称、存储过程和函数的区别标识、子程序公有和私有区别标识、对应包的唯一标识号等。
[0063] 包管理器在神通数据库中具有全局属性,由多个包项目组成,每个包项目对应一个包;它记录了包的唯一标识号、包头和包体是否失效、包被置为有效时的时间戳、包头和包体的语法树、以及包中存储过程和函数的语法树。包管理器上还拥有一个读写锁,当遍历包管理器时,加读锁;当创建或删除包时,加写锁。
[0064] 包实例是在神通数据库的用户会话过程中建立的会话级的哈希表,该哈希表用于存放被使用的包的信息。每个包实例对应一个包,它记录了包的唯一标识号、包头声明的公有全局变量的拷贝、包体声明的私有全局变量的拷贝、以及包被置为有效时的时间戳的拷贝。
[0065] 下面分别对神通数据库的包的创建方法、包的执行方法、包的编译方法和包的删除方法分别进行说明。
[0066] 1、包的创建方法包括包头的创建方法和包体的创建方法。
[0067] 如图1所示,包头的创建过程包括以下步骤:
[0068] (1)语法解析模块对包头创建语句的解析
[0069] 在本步骤中,语法解析模块负责对包头除声明语句外的定义部分的解析,确认包的创建语法正确性,并获取包的名称和所属模式。
[0070] (2)包头在关系系统表中的存储
[0071] 在本步骤中,语言定义模块为包分配唯一标识号,并将唯一标识号、包名、所属模式等存放于关系系统表中。
[0072] (3)包头源码在源码系统表中的存储
[0073] 在本步骤中,语言定义模块负责包在关系系统表中的存储和包头源码在源码系统表中的存储。
[0074] (4)过程语言模块对包头声明部分的编译
[0075] 在本步骤中,过程源码模块从源码系统表中获取全局变量、存储过程和函数的声明进行编译。
[0076] (5)包头对象在包变量系统表、包子程序系统表中的存储
[0077] 在本步骤中,过程语言模块将上一步编译出的全局变量的信息存入包变量系统表,将存储过程和函数的信息存入包子程序系统表。
[0078] (6)包头依赖关系在依赖关系系统表中的存储
[0079] 在本步骤中,过程语言模块将包的唯一标识号和被引用的其他包和表的唯一标识号存放与依赖关系系统表中。
[0080] (7)包管理器中新增包项目
[0081] 在本步骤中,首先对包管理器加写锁;然后构造一个新的包项目,存入包的唯一标识号、包头的语法树,将包头的有效标识置为真;最后释放包管理器的写锁。
[0082] 如图2所示,包体的创建方法,包括以下步骤:
[0083] (1)语法解析模块对包体创建语句的解析
[0084] 在本步骤中,同包头的创建一样,语法解析模块负责对创建包体的语句进行解析,确认包的创建语法正确性,并获取包的名称和所属模式。
[0085] (2)检查包头是否编译
[0086] 在本步骤中,语法解析模块检查包头后,如果包头没有编译,则对包头进行编译,即从源码系统表中获取包头的源码,过程语言模块对包头的声明部分进行编译,然后将包头对象存放于包变量系统表和包子程序系统表中,将包对其他包和表的依赖关系存放于依赖关系系统表中,并在包管理器中新增包项目。
[0087] (3)包体在关系系统表和包体源码在源码系统表中的存储
[0088] 在本步骤中,语言定义模块为包体在关系系统表中分配唯一标志号,并将包体的源代码写入源码系统表中。
[0089] (4)过程语言模块对包体的解析
[0090] 在本步骤中,过程语言模块将包体中的声明语句、子程序的定义语句和初始化语句分别进行解析。在包体的存储过程或函数的定义中,嵌套引用了存储过程或函数,如果引用的是本包的、隐含的包名在解析时必须补上。包的存储过程或函数被引用前,必须先声明它。
[0091] (5)包体对象在包变量系统表、包子程序系统表中的存储
[0092] 包体对象是包的私有对象,在本步骤中,过程语言模块将包体对象存储在包变量系统表和包子程序系统表中。
[0093] (6)包体对包头的依赖性检查
[0094] 在本步骤中,过程语言模块进行包体对包头的依赖性检查,由于包体的解析不仅要检查语句块是否符合语法规则,还要检查包体中的过程或函数的说明和包头中对应的过程或函数是否完全相同。该依赖性检查具体方法为:包头中声明的函数或存储过程在包体中有同名的对象;函数或存储过程的参数个数相同;函数或存储过程的参数的数据类型相同;函数或存储过程的参数的输入输出类型相同;在包头和包体的声明语句部分,不能声明相同名字的变量。
[0095] (7)在包管理器中对应包项目增加包体信息
[0096] 在本步骤中,首先对包管理器加写锁;然后找到包管理器中对应该包的包项目,将包体的语法树加入,并把包体有效标识置为真,另外记录有效时的时间戳;最后释放包管理器的写锁。
[0097] 2、包的执行方法。
[0098] 神通数据库对包的执行采用编译预处理技术,即在词法扫描中发现对包中对象的调用语句后,立即找到包的源代码进行解析,然后将解析结果的指针放到包管理器中。在执行包的对象调用语句时,根据存储过程或函数的标志号直接定位到它的语法树然后解释执行该语法树。如果找不到对应的语法树,判断包是否失效,如果是则重新编译;如果不是则提取源码进行重编译。由于包的预编译只需要编译一次包的源代码,在包中对象被多次引用的情况下,可以避免每次执行该对象时的重复编译,从而提高了包的执行效率。
[0099] 如图3所示,包的执行方法包括以下步骤:
[0100] (1)确定包和子程序的唯一标识号
[0101] 在本步骤中,通过对“模式名.包名.包中对象名”的解析,确定包中存储过程或函数的唯一标识号。
[0102] (2)获取包项目
[0103] 在本步骤中,对包管理器加读锁;定位到当前包的包项目,如果有包头或包体失效,则对它进行重新编译。
[0104] (3)获取包实例
[0105] 在本步骤中,如果是本会话中首次执行该包中的对象,则对包进行初始化操作。首先,从包项目拷贝该包的全局变量和有效时的时间戳,然后执行初始化代码,最后将这个包实例插入本会话中的哈希表中;如果不是首次执行该包中的对象,则定位到本会话中的当前包的包实例,判断它和对应的包项目的时间戳是否相等。如果不相等,则对包进行再次初始化操作。
[0106] (4)调用包中的子程序的语法树
[0107] 在本步骤中,通过存储过程或函数的唯一标识号,由此调用对应的语法树。如果涉及全局变量的读写,则对本会话中的包实例的全局变量的拷贝进行操作。
[0108] (5)如果存在包的嵌套调用,则转到第(2)步重复执行
[0109] (6)事物结束
[0110] 在本步骤中,事物结束时将自动释放包管理器的读锁。
[0111] 3、包的编译方法
[0112] 在神通数据库中,当包失效时,需要对包进行重新编译。在如下情况下,包处于失效状态:
[0113] (1)包头和包体在被创建后并且未被引用之前,处于失效状态;
[0114] (2)包依赖的关系被删除或结构发生变化,对应的包头或包体失效;
[0115] (3)包头失效时,包体失效;调用它的子程序失效;
[0116] (4)包头被重新创建,包头失效;
[0117] (5)包体被重新创建,包体失效;
[0118] (6)包头被重新编译,包体失效;
[0119] (7)包头被删除,包头和包体失效;
[0120] (8)包体被删除,包体失效;
[0121] (9)子程序被创建,引用失效包,包头变为有效,包体还是无效。
[0122] 当包失效时,在包管理器中设置失效标识,并删除包变量系统表、包子程序系统表中的该包的对象对应的信息。包每次被执行时,都需要判断包头和包体是否失效,如果包失效,则需要进行包的编译处理。
[0123] 如图4所示,包的编译方法包括以下步骤:
[0124] (1)语法解析模块对包编译语句进行解析,如果编译语句为编译包体,则执行步骤(3)的包体编译步骤,否则执行步骤(2)的包头的编译步骤和步骤(3)的包体的编译步骤;
[0125] (2)包头的编译步骤:首先对包管理器加写锁;然后在源码系统表中获取包头源码,编译包头,重置包头对象在包变量系统表、包子程序系统表中的存储,重置包头在依赖关系系统表中的存储;重置包管理器中的包项目;即将包体的有效标识置为假,另外将依赖于该包的其他包的有效标识置为假;
[0126] (3)包体的编译步骤:首先对包管理器加写锁;然后从源码系统表中获取包体源码对包体进行编译,重置包变量系统表、包子程序系统表、依赖关系系统表中的存储;最后更新包项目中的包体编译信息,即将包体编译有效位置为真并更新时间戳,释放包管理器的写锁。
[0127] 4、包的删除方法
[0128] 如图5所示,包的删除方法包括以下步骤:
[0129] (1)语法解析模块对包删除语句进行解析,如果包删除语句为删除包体,则执行步骤(3)的包体的删除步骤;否则执行步骤(2)的包头删除和步骤(3)的包体的删除步骤;
[0130] (2)包头的删除步骤:首先对包管理器加写锁,删除包对应的包项目,并将引用此包的其他包的包头有效位置为假,释放包管理器的写锁;然后清除包头和包体在包变量系统表、源码系统表、关系系统表和依赖关系系统表中的记录;
[0131] (3)包体的删除步骤:对包管理器加写锁,将包项目中的包体的有效标识置为假,释放包管理器的写锁;然后清除包体在包变量系统表、源码系统表、关系系统表和依赖关系系统表中的记录。
[0132] 本发明所述的实施例是说明性的,而不是限定性的,因此发明并不限于具体实施方式中所述的实施例,凡是由本领域技术人员根据本发明的技术方案得出的其他实施方式,同样属于本发明保护的范围。