CN105589876A - 针对Mysql数据库创建动态游标池的方法、装置以及处理多线程下并发请求的方法、装置 - Google Patents
针对Mysql数据库创建动态游标池的方法、装置以及处理多线程下并发请求的方法、装置 Download PDFInfo
- Publication number
- CN105589876A CN105589876A CN201410570730.5A CN201410570730A CN105589876A CN 105589876 A CN105589876 A CN 105589876A CN 201410570730 A CN201410570730 A CN 201410570730A CN 105589876 A CN105589876 A CN 105589876A
- Authority
- CN
- China
- Prior art keywords
- field
- dynamic
- cursor
- name
- value
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Abstract
本发明提供针对Mysql数据库创建动态游标池的方法、装置以及处理多线程下并发请求的方法、装置,旨在解决现有Mysql数据库因不支持动态游标而带来种种局限的技术问题。所述方法包括:分配用于命名动态视图基名的字段、用于命名动态游标基名的字段、用于记录当前总共分配序号数量的字段以及为请求分配用于定义待分配序号的字段;根据字段生成申请动态游标名存储过程;根据存储过程接口的输入参数和返回的动态视图名生成动态视图;根据动态视图和返回的静态游标名生成动态游标。本发明一方面突破了现有Mysql数据库的游标的局限性,为实现封装带来了很大便利;另一方面,实现可以对大量并发的多线程动态游标请求高效快速地予以响应。
Description
技术领域
本发明属于数据库应用领域,尤其涉及针对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数据库,生成动态视图如下:
CREATEVIEWviewNameASSELECTcolumnFROMtableWHEREconditionColumn=conditionValue
其中,viewName是生成申请动态游标名存储过程时返回的动态视图名,table是提供数据的数据库表,column是table中的字段(一个或多个),conditionColumn是查询条件字段,conditionValue是存储过程接口的输入参数值。
S104,根据步骤S103生成的动态视图和步骤S102生成所述申请动态游标名存储过程时返回的静态游标名,生成动态游标。
如前所述,生成申请动态游标名存储过程时返回动态视图名即生成动态视图。所谓动态游标,指的是可以在游标打开时反映对基础数据进行的修改的游标,用户所做的更新、删除和插入等操作皆可在动态游标中加以反映;从SQL角度,动态游标指的是查询条件可变的游标。在Mysql数据库中,只有静态游标的概念,而不存在动态游标一说。在本实施例中,可以通过生成静态游标来生成动态游标。具体地,对于Mysql数据库,生成动态游标方法如下:
DECLAREcursorNameCURSORFORSELECTconditionFROMviewName。
其中,cursorName是生成申请动态游标名存储过程中返回的静态游标名,viewName是生成申请动态游标名存储过程中返回的动态视图名,condition是需要处理的字段(一个或多个)。
需要说明的是,虽然DECLAREcursorNameCURSORFORSELECTconditionFROMviewName是静态游标的声明,但是,由于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生成动态视图如下:
CREATEVIEWviewNameASSELECTcolumnFROMtableWHEREconditionColumn=conditionValue
其中,viewName是生成申请动态游标名存储过程时返回的动态视图名,table是提供数据的数据库表,column是table中的字段(一个或多个),conditionColumn是查询条件字段,conditionValue是存储过程接口的输入参数值。
动态游标生成模块504,用于根据动态视图和生成申请动态游标名存储过程时返回的静态游标名,生成动态游标。
如前所述,生成申请动态游标名存储过程时返回动态视图名即生成动态视图。所谓动态游标,指的是可以在游标打开时反映对基础数据进行的修改的游标,用户所做的更新、删除和插入等操作皆可在动态游标中加以反映;从SQL角度,动态游标指的是查询条件可变的游标。在Mysql数据库中,只有静态游标的概念,而不存在动态游标一说。在本实施例中,动态游标生成模块504可以通过生成静态游标来生成动态游标。具体地,对于Mysql数据库,动态游标生成模块504生成动态游标方法如下:
DECLAREcursorNameCURSORFORSELECTconditionFROMviewName。
其中,cursorName是生成申请动态游标名存储过程中返回的静态游标名,viewName是生成申请动态游标名存储过程中返回的动态视图名,condition是需要处理的字段(一个或多个)。
需要说明的是,虽然DECLAREcursorNameCURSORFORSELECTconditionFROMviewName是静态游标的声明,但是,由于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数据库创建动态游标池的方法、装置以及处理多线程下并发请求的方法、装置进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
Claims (12)
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数据库处理多线程下并发请求的装置,其特征在于,所述装置包括:
第一调用模块,用于业务层调用存储过程接口函数;
第二调用模块,用于根据所述业务层调用存储过程接口函数的调用结果,数据存储层调用申请动态游标名存储过程以获取动态视图名和静态游标名;
生成模块,用于所述数据存储层根据所述动态视图名、静态游标名和所述存储过程接口函数的输入参数,生成动态视图和动态游标;
结果返回模块,用于所述数据存储层遍历所述动态游标,将生成的业务结果返回至所述存储过程接口函数的输出参数;
游标回收模块,用于所述数据存储层回收所述动态游标。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410570730.5A CN105589876A (zh) | 2014-10-22 | 2014-10-22 | 针对Mysql数据库创建动态游标池的方法、装置以及处理多线程下并发请求的方法、装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410570730.5A CN105589876A (zh) | 2014-10-22 | 2014-10-22 | 针对Mysql数据库创建动态游标池的方法、装置以及处理多线程下并发请求的方法、装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN105589876A true CN105589876A (zh) | 2016-05-18 |
Family
ID=55929463
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410570730.5A Pending CN105589876A (zh) | 2014-10-22 | 2014-10-22 | 针对Mysql数据库创建动态游标池的方法、装置以及处理多线程下并发请求的方法、装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105589876A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108563772A (zh) * | 2018-04-20 | 2018-09-21 | 郑州市轨道交通有限公司 | 基于通用接口的系统间数据共享方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101004759A (zh) * | 2007-01-19 | 2007-07-25 | 兰州大学 | 利用计算机从已有数据库中转换生成特定数据包的方法 |
US20110125630A1 (en) * | 2003-12-05 | 2011-05-26 | Trading Technologies International, Inc. | Method and System for Displaying a Cursor on a Trading Screen |
-
2014
- 2014-10-22 CN CN201410570730.5A patent/CN105589876A/zh active Pending
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20110125630A1 (en) * | 2003-12-05 | 2011-05-26 | Trading Technologies International, Inc. | Method and System for Displaying a Cursor on a Trading Screen |
CN101004759A (zh) * | 2007-01-19 | 2007-07-25 | 兰州大学 | 利用计算机从已有数据库中转换生成特定数据包的方法 |
Non-Patent Citations (2)
Title |
---|
王二暖等: "ORACLE显示游标和动态游标的使用", 《应用技术》 * |
程雨轩: "Mysql动态游标", 《HTTPS://WWW.BBSMAX.COM/A/XL56VAO5RZ/》 * |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108563772A (zh) * | 2018-04-20 | 2018-09-21 | 郑州市轨道交通有限公司 | 基于通用接口的系统间数据共享方法 |
CN108563772B (zh) * | 2018-04-20 | 2022-06-14 | 郑州市轨道交通有限公司 | 基于通用接口的系统间数据共享方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10291704B2 (en) | Networked solutions integration using a cloud business object broker | |
CN108829507B (zh) | 分布式数据库系统的资源隔离方法、装置和服务器 | |
CN104160381B (zh) | 多租户环境中租户特定数据集的管理方法及其系统 | |
US20100030995A1 (en) | Method and apparatus for applying database partitioning in a multi-tenancy scenario | |
US20220261377A1 (en) | Scalable multi-tier storage structures and techniques for accessing entries therein | |
CN107077389A (zh) | 用于在多租户应用服务器环境中使用全局运行时的系统和方法 | |
CN105653372B (zh) | 基于云平台实现多虚拟化混合管理与调度的方法 | |
CN107077388A (zh) | 用于在多租户应用服务器环境中提供端到端生命周期的系统和方法 | |
CN110032604A (zh) | 数据存储装置、转译装置及数据库访问方法 | |
CN105786617B (zh) | 用于扩展无共享系统的装置和方法 | |
CN102110121A (zh) | 一种数据处理方法及其系统 | |
CN105808323A (zh) | 一种虚拟机创建方法及系统 | |
US8589394B2 (en) | System and method for dynamically configuring a multi-model node table | |
CN107977773A (zh) | 一种管理多个云平台的多项目资源额度的方法 | |
CN107943542A (zh) | 一种配置信息管理方法、装置、可读介质及存储控制器 | |
CN109150964A (zh) | 一种可迁移的数据管理方法及服务迁移方法 | |
US11074248B2 (en) | Map of operations for ingesting external data | |
CN104636260A (zh) | 一种用于计费业务的数据管理方法及系统 | |
CN105589876A (zh) | 针对Mysql数据库创建动态游标池的方法、装置以及处理多线程下并发请求的方法、装置 | |
Perwej et al. | An extensive investigate the mapreduce technology | |
CN104239008B (zh) | 并行数据库管理系统及设计方案 | |
CN112559603A (zh) | 特征提取方法、装置、设备及计算机可读存储介质 | |
Shabani et al. | The benefits of using Google Cloud Computing for developing distributed applications | |
CN106022615B (zh) | 基于云计算的企业资源管理方法 | |
CN104133890B (zh) | 一种云端大数据处理方法和系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20160518 |
|
RJ01 | Rejection of invention patent application after publication |