针对Mysql数据库创建动态游标池的方法、装置以及处理多线程下并发请求的方法、装置

阅读: 评论:0

著录项
  • CN201410570730.5
  • 20141022
  • CN105589876A
  • 20160518
  • TCL集团股份有限公司
  • 廖召正
  • G06F17/30
  • G06F17/30 G06F9/44

  • 广东省惠州市仲恺高新技术开发区十九号小区
  • 广东(44)
  • 深圳中一专利商标事务所
  • 张全文
摘要
本发明提供针对Mysql数据库创建动态游标池的方法、装置以及处理多线程下并发请求的方法、装置,旨在解决现有Mysql数据库因不支持动态游标而带来种种局限的技术问题。所述方法包括:分配用于命名动态视图基名的字段、用于命名动态游标基名的字段、用于记录当前总共分配序号数量的字段以及为请求分配用于定义待分配序号的字段;根据字段生成申请动态游标名存储过程;根据存储过程接口的输入参数和返回的动态视图名生成动态视图;根据动态视图和返回的静态游标名生成动态游标。本发明一方面突破了现有Mysql数据库的游标的局限性,为实现封装带来了很大便利;另一方面,实现可以对大量并发的多线程动态游标请求高效快速地予以响应。
权利要求

1.一种针对Mysql数据库创建动态游标池的方法,其特征在于,所述方法 包括:

分配用于命名动态视图基名的字段、分配用于命名动态游标基名的字段、 分配用于记录当前总共分配序号数量的字段以及为请求分配用于定义待分配序 号的字段;

根据所述字段生成申请动态游标名存储过程;

根据存储过程接口的输入参数和生成所述申请动态游标名存储过程时返回 的动态视图名,生成动态视图;

根据所述动态视图和生成所述申请动态游标名存储过程时返回的静态游标 名,生成动态游标。

2.如权利要求1所述的方法,其特征在于,使用字段ra_viewName表示所 述用于命名动态视图基名的字段,使用字段ra_cursorName表示所述用于命名 动态游标基名的字段,使用字段ra_currentNumber表示所述用于记录当前总共 分配序号数量的字段,所述用于定义待分配序号的字段包括字段ia_now、字段 ia_next和字段ra_index;

所述字段ra_viewName的值为动态视图基名,所述字段ra_cursorName的 值为动态游标基名,所述字段ra_currentNumber的值表示当前总共分配出去的 序号数量,所述字段ia_now的值为将要分配的序号,所述字段ia_next的值为 紧接着将要分配的序号,所述字段ra_index的值为要分配给当前请求的序号。

3.如权利要求2所述的方法,其特征在于,所述根据所述字段生成申请动 态游标名存储过程,包括:

为所述申请动态游标名存储过程加锁;

读取所述字段ra_viewName的值、字段ra_cursorName的值和字段ra_index 的值;

将所述字段ra_viewName和字段ra_index的值拼接成字符串作为所述动态 视图名返回,以及将所述字段ra_cursorName和字段ra_index的值拼接成字符 串作为所述静态视图名返回;

使所述字段ra_currentNumber的值增1;

将所述字段ra_index的值更新为所述字段ia_now的值等于所述ra_index字 段的值时相应记录的字段ia_next的值;

为所述申请动态游标名存储过程解锁。

4.如权利要求1所述的方法,其特征在于,所述方法还包括:

生成资源信息表;

根据所述资源信息表和所述字段,生成预分配序号资源存储过程、增量分 配序号资源存储过程和释放动态游标名存储过程。

5.如权利要求4所述的方法,其特征在于,所述生成动态游标之后,所述 方法还包括:

调用所述释放动态游标名存储过程以回收所述动态游标。

6.一种针对Mysql数据库处理多线程下并发请求的方法,其特征在于,所 述方法包括:

业务层调用存储过程接口函数;

根据所述业务层调用存储过程接口函数的调用结果,数据存储层调用申请 动态游标名存储过程以获取动态视图名和静态游标名;

所述数据存储层根据所述动态视图名、静态游标名和所述存储过程接口函 数的输入参数,生成动态视图和动态游标;

所述数据存储层遍历所述动态游标,将生成的业务结果返回至所述存储过 程接口函数的输出参数;

所述数据存储层回收所述动态游标。

7.一种针对Mysql数据库创建动态游标池的装置,其特征在于,所述装置 包括:

分配模块,用于分配用于命名动态视图基名的字段、分配用于命名动态游 标基名的字段、分配用于记录当前总共分配序号数量的字段以及为请求分配用 于定义待分配序号的字段;

第一存储过程生成模块,用于根据所述字段生成申请动态游标名存储过程;

动态视图生成模块,用于根据存储过程接口的输入参数和生成所述申请动 态游标名存储过程时返回的动态视图名,生成动态视图;

动态游标生成模块,用于根据所述动态视图和生成所述申请动态游标名存 储过程时返回的静态游标名,生成动态游标。

8.如权利要求7所述的装置,其特征在于,使用字段ra_viewName表示所 述用于命名动态视图基名的字段,使用字段ra_cursorName表示所述用于命名 动态游标基名的字段,使用字段ra_currentNumber表示所述用于记录当前总共 分配序号数量的字段,所述用于定义待分配序号的字段包括字段ia_now、字段 ia_next和字段ra_index;

所述字段ra_viewName的值为动态视图基名,所述字段ra_cursorName的 值为动态游标基名,所述字段ra_currentNumber的值表示当前总共分配出去的 序号数量,所述字段ia_now的值为将要分配的序号,所述字段ia_next的值为 紧接着将要分配的序号,所述字段ra_index的值为要分配给当前请求的序号。

9.如权利要求8所述的装置,其特征在于,所述第一存储过程生成模块包 括:

加锁单元,用于为所述申请动态游标名存储过程加锁;

字段读取单元,用于读取所述字段ra_viewName的值、字段ra_cursorName 的值和字段ra_index的值;

返回单元,用于将所述字段ra_viewName和字段ra_index的值拼接成字符 串作为所述动态视图名返回,以及将所述字段ra_cursorName和字段ra_index 的值拼接成字符串作为所述静态视图名返回;

更新单元,用于将所述字段ra_index的值更新为所述字段ia_now的值等于 所述ra_index字段的值时相应记录的字段ia_next的值;

自增单元,用于使所述字段ra_currentNumber的值增1;

解锁单元,用于为所述申请动态游标名存储过程解锁。

10.如权利要求7所述的装置,其特征在于,所述装置还包括:

数据表生成模块,用于生成资源信息表;

第二存储过程生成模块,用于根据所述资源信息表和所述字段,生成预分 配序号资源存储过程、增量分配序号资源存储过程和释放动态游标名存储过程。

11.如权利要求10所述的装置,其特征在于,所述装置还包括:

游标回收模块,用于调用所述释放动态游标名存储过程以回收所述动态游 标。

12.一种针对Mysql数据库处理多线程下并发请求的装置,其特征在于,所 述装置包括:

第一调用模块,用于业务层调用存储过程接口函数;

第二调用模块,用于根据所述业务层调用存储过程接口函数的调用结果, 数据存储层调用申请动态游标名存储过程以获取动态视图名和静态游标名;

生成模块,用于所述数据存储层根据所述动态视图名、静态游标名和所述 存储过程接口函数的输入参数,生成动态视图和动态游标;

结果返回模块,用于所述数据存储层遍历所述动态游标,将生成的业务结 果返回至所述存储过程接口函数的输出参数;

游标回收模块,用于所述数据存储层回收所述动态游标。

说明书
技术领域

本发明属于数据库应用领域,尤其涉及针对Mysql数据库创建动态游标池 的方法、装置以及处理多线程下并发请求的方法、装置。

作为免费的大型关系型数据库,Mysql数据库以其优秀的特性在很多云服 务器项目中都被用作数据存储服务器,其自带实现的存储过程、触发器和游标 等高级功能对我们处理应用业务能够带来非常便利的作用。

游标(cursor)是数据库中一个十分重要的概念,其提供了一种对从表中检 索出的数据进行操作的灵活手段。就本质而言,游标实际上是一种能从包括多 条数据记录的结果集中每次提取一条记录的机制。游标总是与一条SQL查询 语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出 的多条记录)和结果集中指向特定记录的游标位置组成。如果游标对应的查询 结果集是随查询条件值的不同而动态生成,则这种游标可称为动态游标;用户 所做的更新、删除和插入在动态游标中加以反映。

鉴于业务开发人员对复杂结构化查询语言(StructuredQueryLanguage, SQL)的设计并不如数据库开发人员那么纯熟、高效。数据库开发人员可以把 复杂业务带来的复杂查询SQL需求的处理过程封装在存储过程中,提供存储过 程接口给业务层,业务层可以直接调用存储过程而不用费心对付复杂SQL的设 计实现,大大降低了业务开发人员对SQL设计的要求,这种架构理念对于分层 分工也有着显著的好处。

然而,与Oracle这种商业数据库不同,现有的Mysql数据库没有提供动态 游标功能,即现有的Mysql数据库的游标不支持动态数据集(也即查询条件动 态可变)。现有Mysql数据库的这种局限性,一方面给数据库开发人员对业务 功能的实现封装带来了很大的束缚;另外一方面,云计算的应用场景决定了对 数据库服务器的并发请求会很多,业务层的某些功能实现不可避免地会导致频 繁并发请求处理动态查询结果数据集的遍历,以现有Mysql数据库的游标,无 法高效快速地对每一个请求予以响应。

本发明的目的在于提供针对Mysql数据库创建动态游标池的方法、装置以 及处理多线程下并发请求的方法、装置,旨在解决现有Mysql数据库因不支持 动态游标而带来种种局限的技术问题。

本发明是这样实现的,一种针对Mysql数据库创建动态游标池的方法,所 述方法包括:

分配用于命名动态视图基名的字段、分配用于命名动态游标基名的字段、 分配用于记录当前总共分配序号数量的字段以及为请求分配用于定义待分配序 号的字段;

根据所述字段生成申请动态游标名存储过程;

根据存储过程接口的输入参数和生成所述申请动态游标名存储过程时返回 的动态视图名,生成动态视图;

根据所述动态视图和生成所述申请动态游标名存储过程时返回的静态游标 名,生成动态游标。

本发明的另一目的在于提供一种针对Mysql数据库处理多线程下并发请求 的方法,所述方法包括:

业务层调用存储过程接口函数;

根据所述业务层调用存储过程接口函数的调用结果,数据存储层调用申请 动态游标名存储过程以获取动态视图名和静态游标名;

所述数据存储层根据所述动态视图名、静态游标名和所述存储过程接口函 数的输入参数,生成动态视图和动态游标;

所述数据存储层遍历所述动态游标,将生成的业务结果返回至所述存储过 程接口函数的输出参数;

所述数据存储层回收所述动态游标。

本发明的另一目的在于提供一种针对Mysql数据库创建动态游标池的装 置,所述装置包括:

分配模块,用于分配用于命名动态视图基名的字段、分配用于命名动态游 标基名的字段、分配用于记录当前总共分配序号数量的字段以及为请求分配用 于定义待分配序号的字段;

第一存储过程生成模块,用于根据所述字段生成申请动态游标名存储过程;

动态视图生成模块,用于根据存储过程接口的输入参数和生成所述申请动 态游标名存储过程时返回的动态视图名,生成动态视图;

动态游标生成模块,用于根据所述动态视图和生成所述申请动态游标名存 储过程时返回的静态游标名,生成动态游标。

本发明的另一目的在于提供一种针对Mysql数据库处理多线程下并发请求 的装置,所述装置包括:

第一调用模块,用于业务层调用存储过程接口函数;

第二调用模块,用于根据所述业务层调用存储过程接口函数的调用结果, 数据存储层调用申请动态游标名存储过程以获取动态视图名和静态游标名;

生成模块,用于所述数据存储层根据所述动态视图名、静态游标名和所述 存储过程接口函数的输入参数,生成动态视图和动态游标;

结果返回模块,用于所述数据存储层遍历所述动态游标,将生成的业务结 果返回至所述存储过程接口函数的输出参数;

游标回收模块,用于所述数据存储层回收所述动态游标。

从上述本发明实施例可知,一方面,由于能够根据存储过程接口的输入参 数和生成申请动态游标名存储过程时返回的动态视图名生成动态视图,以及根 据所述动态视图和生成申请动态游标名存储过程时返回的静态游标名,最终生 成动态游标,因此,突破了现有的Mysql数据库的游标不支持动态数据集这一 局限性,给数据库开发人员对业务功能的实现封装带来了很大便利;另一方面, 业务层可以只需要调用存储过程接口函数即可获取业务结果,从而将复杂SQL 的设计交由给数据库开发人员,分离复杂SQL设计到数据库存储层,降低了对 业务层开发人员的要求,对于分层分工大有好处,而数据存储层通过调用申请 动态游标名存储过程生成动态游标,在将业务结果返回给业务层后,数据存储 层再回收这些动态游标,从而不仅针对Mysql数据库实现了动态游标池,还可 以对大量并发的多线程动态游标请求高效快速地予以响应。

图1是本发明实施例一提供的针对Mysql数据库创建动态游标池的方法的 实现流程示意图;

图2是本发明实施例二提供的针对Mysql数据库创建动态游标池的方法的 实现流程示意图;

图3是本发明实施例三提供的针对Mysql数据库创建动态游标池的方法的 实现流程示意图;

图4是本发明实施例四提供的针对Mysql数据库处理多线程下并发请求的 方法的实现流程示意图;

图5是本发明实施例五提供的针对Mysql数据库创建动态游标池的装置的 结构示意图;

图6是本发明实施例六提供的针对Mysql数据库创建动态游标池的装置的 结构示意图;

图7是本发明实施例七提供的针对Mysql数据库创建动态游标池的装置的 结构示意图;

图8是本发明实施例八提供的针对Mysql数据库创建动态游标池的装置的 结构示意图;

图9是本发明实施例九提供的针对Mysql数据库处理多线程下并发请求的 装置的结构示意图。

为了使本发明的目的、技术方案及有益效果更加清楚明白,以下结合附图 及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施 例仅仅用以解释本发明,并不用于限定本发明。

本发明实施例提供针对Mysql数据库创建动态游标池的方法,所述方法包 括:分配用于命名动态视图基名的字段、分配用于命名动态游标基名的字段、 分配用于记录当前总共分配序号数量的字段以及为请求分配用于定义待分配序 号的字段;根据所述字段生成申请动态游标名存储过程;根据存储过程接口的 输入参数和生成所述申请动态游标名存储过程时返回的动态视图名,生成动态 视图;根据所述动态视图和生成所述申请动态游标名存储过程时返回的静态游 标名,生成动态游标。本发明实施例还提供相应的针对Mysql数据库处理多线 程下并发请求的方法、装置。以下分别进行详细说明。

请参阅附图1,是本发明实施例一提供的针对Mysql数据库创建动态游标 池的方法的实现流程,主要包括以下步骤S101至步骤S104:

S101,分配用于命名动态视图基名的字段、分配用于命名动态游标基名的 字段、分配用于记录当前总共分配序号数量的字段以及为请求分配用于定义待 分配序号的字段。

在本实施例中,可以使用字段ra_viewName表示用于命名动态视图基名的 字段,使用字段ra_cursorName表示用于命名动态游标基名的字段,使用字段 ra_currentNumber表示所述用于记录当前总共分配序号数量的字段,用于定义 待分配序号的字段包括字段ia_now、字段ia_next和字段ra_index。

在本实施例中,用于命名动态视图基名的字段、用于命名动态游标基名的 字段、用于记录当前总共分配序号数量的字段以及用于定义待分配序号的字段 等字段的分配,可以通过分配数据库表来实现。

例如,对于用于命名动态视图基名的字段、用于命名动态游标基名的字段、 用于记录当前总共分配序号数量的字段和字段ra_index的分配,可以通过分配 注册管理表(即info_registerAdministration)来实现,因注册管理表包含有字段 ra_viewName、字段ra_cursorName、字段ra_index、字段ra_totalNumber和字 段ra_currentNumber等五个字段,其中,字段ra_viewName的值表示的实际意 义为动态视图基名,字段ra_cursorName的值表示的实际意义为动态游标基名, 字段ra_currentNumber的值表示当前总共分配出去的序号数量,字段ra_index 的值表示的实际意义为动态游标池要分配给当前请求的序号,字段 ra_totalNumber的值表示的实际意义为可分配序号的总数量,字段 ra_currentNumber的值表示的实际意义为当前总共分配出去的序号数量。

注册管理表的设计格式如下表1所示:


表1

再如,对于字段ia_now和字段ia_next的分配,可以通过分配序号分配表 (即info_indexAdministration)来实现,因序号分配表刚好包含有字段ia_now 和字段ia_next等两个字段,其中,字段ia_now的值表示的实际意义为将要分 配的序号,字段ia_next的值表示的实际意义为紧接着将要分配的序号。序号分 配表的设计格式如下表2所示:

编号 字段名称 字段类型 约束 含义

1 ia_now int unsigned not null 将要分配的序号

2 ia_next int unsigned not null 紧接着将要分配的序号

表2

S102,根据步骤S101分配的字段生成申请动态游标名存储过程。

在本实施例中,存储过程接口是业务层的调用对象,即存储过程接口是由 数据存储层提供给业务层调用的接口,而申请动态游标名存储过程如其他存储 过程一样,是存储过程接口的调用对象。如此,复杂业务的查询需求要求的复 杂SQL设计被封装在申请动态游标名存储过程等存储过程内实现,业务层进行 调用时,只需要以输入参数的实参作为查询条件调用这些存储过程,然后,对 返回的输出参数做后续业务处理。生成申请动态游标名存储过程时,其返回动 态视图名和静态游标名这两个输出参数。

S103,根据存储过程接口的输入参数和生成所述申请动态游标名存储过程 时返回的动态视图名,生成动态视图。

在本实施例中,存储过程接口的输入参数是动态SQL的查询条件值。如前 所述,生成申请动态游标名存储过程时返回的输出参数之一是动态视图名,因 此,可以根据存储过程接口的输入参数和生成所述申请动态游标名存储过程时 返回的动态视图名,生成动态视图。对于Mysql数据库,生成动态视图如下:

CREATEVIEWviewNameASSELECTcolumnFROMtableWHERE conditionColumn=conditionValue

其中,viewName是生成申请动态游标名存储过程时返回的动态视图名, table是提供数据的数据库表,column是table中的字段(一个或多个), conditionColumn是查询条件字段,conditionValue是存储过程接口的输入参数 值。

S104,根据步骤S103生成的动态视图和步骤S102生成所述申请动态游标 名存储过程时返回的静态游标名,生成动态游标。

如前所述,生成申请动态游标名存储过程时返回动态视图名即生成动态视 图。所谓动态游标,指的是可以在游标打开时反映对基础数据进行的修改的游 标,用户所做的更新、删除和插入等操作皆可在动态游标中加以反映;从SQL 角度,动态游标指的是查询条件可变的游标。在Mysql数据库中,只有静态游 标的概念,而不存在动态游标一说。在本实施例中,可以通过生成静态游标来 生成动态游标。具体地,对于Mysql数据库,生成动态游标方法如下:

DECLAREcursorNameCURSORFORSELECTconditionFROM viewName。

其中,cursorName是生成申请动态游标名存储过程中返回的静态游标名, viewName是生成申请动态游标名存储过程中返回的动态视图名,condition是需 要处理的字段(一个或多个)。

需要说明的是,虽然DECLAREcursorNameCURSORFORSELECT conditionFROMviewName是静态游标的声明,但是,由于viewName是动态视 图名,此处的condition成为一个可变的查询条件,因此,按照前述对动态游标 的定义和说明(动态游标指的是查询条件可变的游标),对静态游标的声明实 质上是生成动态游标的过程。

从上述附图1示例的针对Mysql数据库创建动态游标池的方法可知,由于 能够根据存储过程接口的输入参数和生成申请动态游标名存储过程时返回的动 态视图名生成动态视图,以及根据所述动态视图和生成申请动态游标名存储过 程时返回的静态游标名,最终生成动态游标,因此,突破了现有的Mysql数据 库的游标不支持动态数据集这一局限性,给数据库开发人员对业务功能的实现 封装带来了很大便利。

请参阅附图2,是本发明实施例二提供的针对Mysql数据库创建动态游标 池的方法的实现流程,主要包括以下步骤S201至步骤S209:

S201,分配用于命名动态视图基名的字段、分配用于命名动态游标基名的 字段、分配用于记录当前总共分配序号数量的字段以及为请求分配用于定义待 分配序号的字段。

本实施例中,步骤S201的过程与附图1示例的步骤S101相同,具体可参 阅步骤S101的说明,此处不做赘述。

S202,为申请动态游标名存储过程加锁。

由于申请动态游标名存储过程等存储过程类似C++、Java等编程语言中的 函数,是非线程安全的,在多线程环境下,这个操作过程会被多个线程共享, 因此可通过加锁以保证线程独占以及分配给每一个线程的动态视图名和静态游 标名唯一。所谓加锁,就是锁定、独占、排它,一个线程只有获取到锁,才能 往下执行,否则等待获得锁。加锁方法为:get_lock(锁名称,等待时间)。

S203,读取字段ra_viewName的值、字段ra_cursorName的值和字段ra_index 的值。

在本实施例中,字段ra_viewName的值表示的实际意义为动态视图基名, 字段ra_cursorName的值表示的实际意义为动态游标基名,字段ra_index的值 表示的实际意义为动态游标池要分配给当前请求的序号。

S204,将字段ra_viewName和字段ra_index的值拼接成字符串作为动态视 图名返回,以及将字段ra_cursorName和字段ra_index的值拼接成字符串作为 静态视图名返回。

在本实施例中,将字段ra_viewName和字段ra_index的值拼接成字符串即 动态视图名,作为申请动态游标名存储过程的一个输出参数返回,将字段 ra_cursorName和字段ra_index的值拼接成字符串即静态视图名,作为申请动态 游标名存储过程的另一个输出参数返回。

S205,使字段ra_currentNumber的值增1。

在本实施例中,使字段ra_currentNumber的值增1可以通过使字段 ra_currentNumber的值自增1实现,其目的在于记录当前总共分配出去的序号 的数量。

S206,将字段ra_index的值更新为字段ia_now的值等于ra_index字段的值 时相应记录的字段ia_next的值。

在本实施例中,字段ra_index的值是要分配给当前请求的序号,字段ia_now 的值是将要分配的序号,而字段ia_next的值是紧接着将要分配的序号。

S207,为申请动态游标名存储过程解锁。

此处的解锁意义刚好与步骤S202加锁的意义相反,可参阅前述步骤S202 的说明。

S208,根据存储过程接口的输入参数和生成申请动态游标名存储过程时返 回的动态视图名,生成动态视图。

本实施例中,步骤S208的过程与附图1示例的步骤S103相同,具体可参 阅步骤S103的说明,此处不做赘述。

S209,根据步骤S208生成的动态视图和步骤S202至步骤S207生成所述 申请动态游标名存储过程时返回的静态游标名,生成动态游标。

本实施例中,步骤S209的过程与附图1示例的步骤S104相同,具体可参 阅步骤S104的说明,此处不做赘述。

从上述附图2示例的针对Mysql数据库创建动态游标池的方法可知,由于 能够根据存储过程接口的输入参数和生成申请动态游标名存储过程时返回的动 态视图名生成动态视图,以及根据所述动态视图和生成申请动态游标名存储过 程时返回的静态游标名,最终生成动态游标,因此,突破了现有的Mysql数据 库的游标不支持动态数据集这一局限性,给数据库开发人员对业务功能的实现 封装带来了很大便利。

请参阅附图3,是本发明实施例三提供的针对Mysql数据库创建动态游标 池的方法的实现流程,主要包括以下步骤S301至步骤S306:

S301,分配用于命名动态视图基名的字段、分配用于命名动态游标基名的 字段、分配用于记录当前总共分配序号数量的字段以及为请求分配用于定义待 分配序号的字段。

本实施例中,步骤S301的过程与附图1示例的步骤S101相同,具体可参 阅步骤S101的说明,此处不做赘述。

S302,生成资源信息表。

在本实施例中,资源信息表(即info_resource)包含res_initialNumber和 res_incrementNumber两个字段,均为intunsigned型,其中,字段 res_initialNumber的值表示的实际意义为序号分配表的初始化记录数量,字段 res_incrementNumber的值表示的实际意义为序号分配表的增量记录数量。资源 信息表的设计格式如下表3所示:


表3

需要说明的是,本实施例中,步骤S302可在步骤S301之前执行,也可与 步骤S301同时执行,本发明对此不做限制。

S303,根据资源信息表和步骤S301分配的字段,生成预分配序号资源存 储过程、增量分配序号资源存储过程和释放动态游标名存储过程。

在本实施例中,生成预分配序号资源存储过程具体包括:读取资源信息表 中字段res_initialNumber的值;循环插入记录到序号分配表即 info_indexAllocation,其中,循环条件从1到字段res_initialNumber的值,对于 每一记录,字段ia_now的值等于循环序号,字段ia_next的值等于字段ia_now 的值加1。

在本实施例中,生成增量分配序号资源存储过程具体包括:读取注册管理 表即info_registerAdministration中字段ra_totalNumber的值以及资源信息表即 info_resource中字段res_incrementNumber的值;循环插入记录到序号分配表即 info_indexAllocation,其中,循环条件从字段ra_totalNumber的值+1到字段 ra_totalNumber的值+字段res_incrementNumber的值,对于每一记录,字段 ia_now的值等于循环序号,字段ia_next的值等于字段ia_now的值加1。

在本实施例中,增量分配序号资源是通过序号用完增量添加触发器触发完 成的,具体地,触发程序(即序号用完增量添加触发器的触发过程)与注册管 理表(即info_registerAdministration)相关,触发时间为BEFORE,触发程序语 句的类型为UPDATE,触发程序判断如果注册管理表中字段ra_currentNumber 的值等于字段ra_totalNumber的值,则调用增量分配序号资源存储过程,增量 分配序号资源。

在本实施例中,生成释放动态游标名存储过程具体包括:为释放动态游标 名存储过程加锁;将动态游标名拆分取其序号值;在序号分配表即 info_indexAllocation中以字段ia_now的值等于该序号值为条件,更新字段 ia_next的值为注册管理表即info_registerAdministration中字段ra_index的值; 更新注册管理表即info_registerAdministration中字段ra_index的值为动态游标 名拆分所取的序号值并且字段ra_currentNumber的值自减1;为释放动态游标 名存储过程解锁。

S304,根据步骤S301分配的字段生成申请动态游标名存储过程。

本实施例中,步骤S304的过程与附图1示例的步骤S102相同,具体可参 阅步骤S102的说明,此处不做赘述。

需要说明的是,本实施例中,步骤S303可在步骤S304之后执行,也可与 步骤S304同时执行,本发明对此不做限制。

S305,根据存储过程接口的输入参数和生成所述申请动态游标名存储过程 时返回的动态视图名,生成动态视图。

本实施例中,步骤S305的过程与附图1示例的步骤S103相同,具体可参 阅步骤S103的说明,此处不做赘述。

S306,根据动态视图和生成申请动态游标名存储过程时返回的静态游标名, 生成动态游标。

本实施例中,步骤S306的过程与附图1示例的步骤S104相同,具体可参 阅步骤S104的说明,此处不做赘述。

在本实施例中,生成动态游标之后,还包括:调用步骤S303生成的释放 动态游标名存储过程以回收所述动态游标。

从上述附图3示例的针对Mysql数据库创建动态游标池的方法可知,由于 能够根据存储过程接口的输入参数和生成申请动态游标名存储过程时返回的动 态视图名生成动态视图,以及根据所述动态视图和生成申请动态游标名存储过 程时返回的静态游标名,最终生成动态游标,因此,突破了现有的Mysql数据 库的游标不支持动态数据集这一局限性,给数据库开发人员对业务功能的实现 封装带来了很大便利。

请参阅附图4,是本发明实施例四提供的针对Mysql数据库处理多线程下 并发请求的方法的实现流程,主要包括以下步骤S401至步骤S405:

S401,业务层调用存储过程接口函数。

在本实施例中,存储过程接口函数的定义如下所示:

CREATEPROCEDUREprocedureName(INconditiontype,

...

OUTexporttype,

...

)

存储过程接口函数定义了存储过程名和参数,存储过程名(procedureName) 说明该存储过程的功能,参数则包括输入参数和输出参数,其中,输入参数 (condition)可以是一个或多个,表示动态SQL的查询条件值,输出参数(export) 可以是一个或多个,可以是业务层处理反馈的单个或多个值,或者是一张表的 表名及字段名。若输出的值比较多,则可存储到临时数据库表中,此时,输出 参数的含义是表名及字段名,表中的记录则是实际值。

S402,根据业务层调用存储过程接口函数的调用结果,数据存储层调用申 请动态游标名存储过程以获取动态视图名和静态游标名。

在本实施例中,申请动态游标名存储过程、动态视图名和静态游标名分别 与前述附图1至附图3示例的申请动态游标名存储过程、动态视图名和静态游 标名相同,可以参阅前述实施例的相关说明,此处不做赘述。

S403,数据存储层根据动态视图名、静态游标名和存储过程接口函数的输 入参数,生成动态视图和动态游标。

在本实施例中,生成动态视图和动态游标可参阅与前述附图1至附图3示 例的生成动态视图和动态游标。

S404,数据存储层遍历动态游标,将生成的业务结果返回至存储过程接口 函数的输出参数。

S405,数据存储层回收动态游标。

在本实施例中,数据存储层回收动态游标可以通过调用释放动态游标名存 储过程来实现。数据存储层调用成功后,运行释放动态游标名存储过程,释放 动态游标名的序号,从而回收动态游标。

请参阅附图5,是本发明实施例五提供的针对Mysql数据库创建动态游标 池的装置的结构示意图,附图5示例的针对Mysql数据库创建动态游标池的装 置可以是附图1至附图3示例的针对Mysql数据库创建动态游标池的方法的执 行主体。为了便于说明,附图5仅示出了与本发明实施例相关的部分。附图5 示例的针对Mysql数据库创建动态游标池的装置主要包括分配模块501、第一 存储过程生成模块502、动态视图生成模块503和动态游标生成模块504,各功 能模块详细说明如下:

分配模块501,用于分配用于命名动态视图基名的字段、分配用于命名动 态游标基名的字段、分配用于记录当前总共分配序号数量的字段以及为请求分 配用于定义待分配序号的字段。

在本实施例中,可以使用字段ra_viewName表示用于命名动态视图基名的 字段,使用字段ra_cursorName表示用于命名动态游标基名的字段,使用字段 ra_currentNumber表示所述用于记录当前总共分配序号数量的字段,用于定义 待分配序号的字段包括字段ia_now、字段ia_next和字段ra_index。

在本实施例中,用于命名动态视图基名的字段、用于命名动态游标基名的 字段、用于记录当前总共分配序号数量的字段以及用于定义待分配序号的字段 等字段的分配,可以通过分配模块501分配数据库表来实现。例如,对于用于 命名动态视图基名的字段、用于命名动态游标基名的字段、用于记录当前总共 分配序号数量的字段和字段ra_index的分配,可以通过分配模块501分配注册 管理表(即info_registerAdministration)来实现,因注册管理表包含有字段 ra_viewName、字段ra_cursorName、字段ra_index、字段ra_totalNumber和字 段ra_currentNumber等五个字段,其中,字段ra_viewName的值表示的实际意 义为动态视图基名,字段ra_cursorName的值表示的实际意义为动态游标基名, 字段ra_currentNumber的值表示当前总共分配出去的序号数量,字段ra_index 的值表示的实际意义为动态游标池要分配给当前请求的序号,字段 ra_totalNumber的值表示的实际意义为可分配序号的总数量,字段 ra_currentNumber的值表示的实际意义为当前总共分配出去的序号数量。注册 管理表的设计格式如前述表1所示。

再如,对于字段ia_now和字段ia_next的分配,可以通过分配模块501分 配序号分配表(即info_indexAdministration)来实现,因序号分配表刚好包含 有字段ia_now和字段ia_next等两个字段,其中,字段ia_now的值表示的实际 意义为将要分配的序号,字段ia_next的值表示的实际意义为紧接着将要分配的 序号。序号分配表的设计格式如前述下表2所示。

第一存储过程生成模块502,用于根据分配模块501分配的字段生成申请 动态游标名存储过程。

在本实施例中,存储过程接口是业务层的调用对象,即存储过程接口是由 数据存储层提供给业务层调用的接口,而申请动态游标名存储过程如其他存储 过程一样,是存储过程接口的调用对象。如此,复杂业务的查询需求要求的复 杂SQL设计被封装在申请动态游标名存储过程等存储过程内实现,业务层进行 调用时,只需要以输入参数的实参作为查询条件调用这些存储过程,然后,对 返回的输出参数做后续业务处理。第一存储过程生成模块502生成申请动态游 标名存储过程时,其返回动态视图名和静态游标名这两个输出参数。

动态视图生成模块503,用于根据存储过程接口的输入参数和生成申请动 态游标名存储过程时返回的动态视图名,生成动态视图。

在本实施例中,存储过程接口的输入参数是动态SQL的查询条件值。如前 所述,生成申请动态游标名存储过程时返回的输出参数之一是动态视图名,因 此,动态视图生成模块503可以根据存储过程接口的输入参数和生成所述申请 动态游标名存储过程时返回的动态视图名,生成动态视图。对于Mysql数据库, 动态视图生成模块503生成动态视图如下:

CREATEVIEWviewNameASSELECTcolumnFROMtableWHERE conditionColumn=conditionValue

其中,viewName是生成申请动态游标名存储过程时返回的动态视图名, table是提供数据的数据库表,column是table中的字段(一个或多个), conditionColumn是查询条件字段,conditionValue是存储过程接口的输入参数 值。

动态游标生成模块504,用于根据动态视图和生成申请动态游标名存储过 程时返回的静态游标名,生成动态游标。

如前所述,生成申请动态游标名存储过程时返回动态视图名即生成动态视 图。所谓动态游标,指的是可以在游标打开时反映对基础数据进行的修改的游 标,用户所做的更新、删除和插入等操作皆可在动态游标中加以反映;从SQL 角度,动态游标指的是查询条件可变的游标。在Mysql数据库中,只有静态游 标的概念,而不存在动态游标一说。在本实施例中,动态游标生成模块504可 以通过生成静态游标来生成动态游标。具体地,对于Mysql数据库,动态游标 生成模块504生成动态游标方法如下:

DECLAREcursorNameCURSORFORSELECTconditionFROM viewName。

其中,cursorName是生成申请动态游标名存储过程中返回的静态游标名, viewName是生成申请动态游标名存储过程中返回的动态视图名,condition是需 要处理的字段(一个或多个)。

需要说明的是,虽然DECLAREcursorNameCURSORFORSELECT conditionFROMviewName是静态游标的声明,但是,由于viewName是动态视 图名,此处的condition成为一个可变的查询条件,因此,按照前述对动态游标 的定义和说明(动态游标指的是查询条件可变的游标),对静态游标的声明实 质上是生成动态游标的过程。

需要说明的是,以上附图5示例的针对Mysql数据库创建动态游标池的装 置的实施方式中,各功能模块的划分仅是举例说明,实际应用中可以根据需要, 例如相应硬件的配置要求或者软件的实现的便利考虑,而将上述功能分配由不 同的功能模块完成,即将所述针对Mysql数据库创建动态游标池的装置的内部 结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。而且,实 际应用中,本实施例中的相应的功能模块可以是由相应的硬件实现,也可以由 相应的硬件执行相应的软件完成,例如,前述的分配模块,可以是具有执行前 述分配用于命名动态视图基名的字段、分配用于命名动态游标基名的字段、分 配用于记录当前总共分配序号数量的字段以及为请求分配用于定义待分配序号 的字段的硬件,例如分配器,也可以是能够执行相应计算机程序从而完成前述 功能的一般处理器或者其他硬件设备;再如前述的第一存储过程生成模块,可 以是执行根据所述字段生成申请动态游标名存储过程的硬件,例如第一存储过 程生成器,也可以是能够执行相应计算机程序从而完成前述功能的一般处理器 或者其他硬件设备(本说明书提供的各个实施例都可应用上述描述原则)。

附图5示例的第一存储过程生成模块502可以包括加锁单元601、字段读 取单元602、返回单元603、更新单元604、自增单元605和解锁单元606,如 附图6所示本发明实施例六提供的针对Mysql数据库创建动态游标池的装置, 其中:

加锁单元601,用于为所述申请动态游标名存储过程加锁;

字段读取单元602,用于读取所述字段ra_viewName的值、字段 ra_cursorName的值和字段ra_index的值;

返回单元603,用于将所述字段ra_viewName和字段ra_index的值拼接成 字符串作为所述动态视图名返回,以及将所述字段ra_cursorName和字段 ra_index的值拼接成字符串作为所述静态视图名返回;

更新单元604,用于将所述字段ra_index的值更新为所述字段ia_now的值 等于所述ra_index字段的值时相应记录的字段ia_next的值;

自增单元605,用于使所述字段ra_currentNumber的值增1;

解锁单元606,用于为所述申请动态游标名存储过程解锁。

附图5示例的针对Mysql数据库创建动态游标池的装置还可以包括数据表 生成模块701和第二存储过程生成模块702,如附图7所示本发明实施例七提 供的针对Mysql数据库创建动态游标池的装置,其中:

数据表生成模块701,用于生成资源信息表。

在本实施例中,在本实施例中,数据表生成模块701生成的资源信息表(即 info_resource)包含res_initialNumber和res_incrementNumber两个字段,均为 intunsigned型,其中,字段res_initialNumber的值表示的实际意义为序号分配 表的初始化记录数量,字段res_incrementNumber的值表示的实际意义为序号分 配表的增量记录数量。资源信息表的设计格式如前述实施例的表3所示。

第二存储过程生成模块702,用于根据所述资源信息表和所述字段,生成 预分配序号资源存储过程、增量分配序号资源存储过程和释放动态游标名存储 过程。

在本实施例中,第二存储过程生成模块702生成预分配序号资源存储过程 具体包括:读取资源信息表中字段res_initialNumber的值;循环插入记录到序 号分配表即info_indexAllocation,其中,循环条件从1到字段res_initialNumber 的值,对于每一记录,字段ia_now的值等于循环序号,字段ia_next的值等于 字段ia_now的值加1。

在本实施例中,第二存储过程生成模块702生成增量分配序号资源存储过 程具体包括:读取注册管理表即info_registerAdministration中字段 ra_totalNumber的值以及资源信息表即info_resource中字段 res_incrementNumber的值;循环插入记录到序号分配表即info_indexAllocation, 其中,循环条件从字段ra_totalNumber的值+1到字段ra_totalNumber的值+ 字段res_incrementNumber的值,对于每一记录,字段ia_now的值等于循环序 号,字段ia_next的值等于字段ia_now的值加1。

在本实施例中,增量分配序号资源是通过序号用完增量添加触发器触发完 成的,具体地,触发程序(即序号用完增量添加触发器的触发过程)与注册管 理表(即info_registerAdministration)相关,触发时间为BEFORE,触发程序语 句的类型为UPDATE,触发程序判断如果注册管理表中字段ra_currentNumber 的值等于字段ra_totalNumber的值,则调用增量分配序号资源存储过程,增量 分配序号资源。

在本实施例中,第二存储过程生成模块702生成释放动态游标名存储过程 具体包括:为释放动态游标名存储过程加锁;将动态游标名拆分取其序号值; 在序号分配表即info_indexAllocation中以字段ia_now的值等于该序号值为条 件,更新字段ia_next的值为注册管理表即info_registerAdministration中字段 ra_index的值;更新注册管理表即info_registerAdministration中字段ra_index的 值为动态游标名拆分所取的序号值并且字段ra_currentNumber的值自减1;为 释放动态游标名存储过程解锁。

附图7示例的针对Mysql数据库创建动态游标池的装置还可以包括游标回 收模块801,如附图8所示本发明实施例八提供的针对Mysql数据库创建动态 游标池的装置。游标回收模块801用于调用第二存储过程生成模块702生成的 释放动态游标名存储过程以回收动态游标。

请参阅附图9,是本发明实施例九提供的针对Mysql数据库处理多线程下 并发请求的装置的结构示意图。为了便于说明,附图9仅示出了与本发明实施 例相关的部分。附图9示例的针对Mysql数据库处理多线程下并发请求的装置 包括第一调用模块901、第二调用模块902、生成模块903、结果返回模块904 和游标回收模块905,各功能模块详细说明如下:

第一调用模块901,用于业务层调用存储过程接口函数;

第二调用模块902,用于根据所述业务层调用存储过程接口函数的调用结 果,数据存储层调用申请动态游标名存储过程以获取动态视图名和静态游标名;

生成模块903,用于所述数据存储层根据所述动态视图名、静态游标名和 所述存储过程接口函数的输入参数,生成动态视图和动态游标;

结果返回模块904,用于所述数据存储层遍历所述动态游标,将生成的业 务结果返回至所述存储过程接口函数的输出参数;

游标回收模块905,用于所述数据存储层回收所述动态游标。

需要说明的是,上述装置各模块/单元之间的信息交互、执行过程等内容, 由于与本发明方法实施例基于同一构思,其带来的技术效果与本发明方法实施 例相同,具体内容可参见本发明方法实施例中的叙述,此处不再赘述。

本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤 是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存 储介质中,存储介质可以包括:只读存储器(ROM,ReadOnlyMemory)、随 机存取存储器(RAM,RandomAccessMemory)、磁盘或光盘等。

以上对本发明实施例所提供的针对Mysql数据库创建动态游标池的方法、装 置以及处理多线程下并发请求的方法、装置进行了详细介绍,本文中应用了具 体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮 助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据 本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本 说明书内容不应理解为对本发明的限制。

本文发布于:2023-04-14 21:56:30,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/3/86874.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图