已阅读5页,还剩58页未读, 继续免费阅读
(计算机软件与理论专业论文)基于虚拟机的存储过程设计与实现.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
华中科技大学硕士学位论文 摘要 存储过程在数据库管理系统中占有重要的地位。通过存储过程可以将一部分应 用逻辑从客户端转移到服务器,同时通过存储过程的封装实现模块化,有效地提高 应用系统的开发与运行效率。“国产数据库管理系统d m 3 ”所支持的、基于虚拟机的 存储过程子系统由消息分发器,编译器、虚拟机、权限管理模块、删除模块和数据 字典六部分组成。 编译器将存储过程源程序翻译成虚拟机字节码存储到数据字典中,虚拟机从数 据字典中读取字节码序列解释执行。存储过程的处理实际上分成两部分:过程化结 构由存储过程予系统处理;s q l 语句首先由存储过程子系统进行预处理,然后再提 交给d m 3 核心模块的s q l 引擎处理。 作为d m 3 的存储过程语言,d m p l s q l ( d a m e n gp r o c e d u r a ll a n g u a g e s t r u c t u r e d q u e r yl a n g u a g e ) 实现了将过程结构与s q l 语句的无缝集成,从而为用户提供了一 种功能强大的、易于使用的结构化程序设计语言。d m p l s q l 还具有嵌套定义和异常 处理等特性。 触发器是一种特殊的存储过程,在存储过程虚拟机的基础上能够方便地实现触 发器功能。作为一种补充,扩展存储过程将数据库系统与操作系统连接起来,所提 供的功能超出了s q l 语句的能力。 为了进一步提高系统的工作效率,从虚拟机本身和存储过程的特性出发,可以 对存储过程的实现过程作进一步优化。如:优化虚拟机指令分派处理;缓存s q l 语 句的查询计划,通过复用查询计划提高系统的性能;改变分布式调用方式以减少网 络通信量;将数据栈节点中的变长数据部分分离出去,在保证随机访问特性的前提 下减少数据栈节点占用的空间。 关键词:数据库管理系统,虚拟机,存储过程,触发器 华中科技大学硕士学位论文 a b s tr a c t s t o r e dp r o c e d u r ep l a y sa ni m p o r t a n tr o l ei nd b m s s o m ea p p l i c a t i o nl o g i o c a nb es h i f t e df r o me l i e n ts i d et os e r v e rs i d et h r o u g hs t o r e dp r o c e d u r ea n d t h ee n c a p s u l a t i o no fs t o r e dp r o c e d u r ea c h i e v e sm o d u l a r i z a t i o n ,t h u st h e e f f ic i e n c yo fa p p l i c a t i o ns y s t e mi si m p r o v e d t h es t o r e dp r o c e d u r es u b s y s t e m w h i c hi ss u p p o r t e db yd b m sd m 3a n db a s e do nv i r t u a lm a c h i n e ,c o n s i s t so fs i x p a r t s :m e s s a g ed i s p a t c h e r ,c o m p i l e r ,v i r t u a lm a c h i n e ,p r i v i l e g em a n a g e m e n t m o d e l 】d e l e t i o nm o d e la n dd a t ad i c t i o n a r y t h ec o m p i l e rt r a n s l a t e ss o u r c ec o d eo fas t o r ep r o c e d u r et ob y t ec o d ea n d s t o r e si ti nt h ed a t ad i c t i o n a r y ,a n da f t e r w a r dt h ev i r t u a lm a c h i n el o a d s t h eb y t ec o d ef r o md a t ad i c t i o n a r yt oi n t e r p r e ti t t h ep r o c e s so fs t o r e d p r o c e d u r eis d i v i d e di n t ot w op a r t s :p r o c e d u r a ls t r u c t u r e sa r eh a n d l e db y t h es t o r e dp r o c e d u r es u b s y s t e m :s o ls t a t e m e n t sa r ef i r s tp r e t r e a t e db yt h e s u b s y s t e ma n dt h e nd e l i v e r e dt ot h es q le n g i n ei nd m 3k e r n e lm o d u l e a st h ep r o g r a m m i n gl a n g u a g ef o rd m 3s t o r e dp r o c e d u r e ,d m p l s q l ( d a m e n g p r o c e d u r a l l a n g u a g e s t r u c t u r e dq u e r yl a n g u a g e ) i n t e g r a t e sp r o c e d u r a l s t r u c t u r e sa n ds o ls e a m l e s s l y ,t h u sp r o v i d e se n d u s e r sw i t hap o w e r f u la n d e a s y t o u s es t r u c t u r a lp r o g r a m m i n gl a n g u a g e d m p l s q ls u p p o r t ss u b r o u t i n e n e s t i n g ,e x c e p t i o nh a n d l i n ga n do t h e rc h a r a c t e r s t r i g g e ri sak i n do fs p e c i a ls t o r e dp r o c e d u r e i tc a nb ee a s i l yi m p l e m e n t e d b a s i n go ns t o r e dp r o c e d u r ev i r t u a lm a c h i n e e x t e n d e ds t o r e dp r o c e d u r ef i l l s t h eg a pb e t w e e nd b m sa n do s ,a n dc a np r o v i d ef u n c t i o n sb e y o n da b i l i t i e so f s q l t oi m p r o v et h ee f f i c i e n c yo fa p p l i c a t i o ns y s t e mf u r t h e r ,c o n s i d e r i n gt h e v i r t u a lm a c h i n ei t s e l fa n df e a t u r e so fs t o r e d p r o c e d u r ew ea d a p ts o m e o p t i m i z a t i o n s i n s t r u c t i o nd i s p a t c h i s o p t i m i z e d ;q u e r yp l a n s o fs q l s t a t e m e n t sa r ec a c h e df o rr e u s i n g :d i s t r i b u t e di n v o c a t i o n sa r ei m p r o v e dt o l o wd o w nt h en e t w o r kt r a f f i c :t h ev a r i a b l e p a r t o fd a t as t a c kn o d e i s i i 华中科技大学硕士学位论文 s e p a r a t e df r o mt h en o d et or e d u c es p a c eo c c u p i e db yt h ed a t as t a c kw h i l et h e r a n d o m a c c e s sa b i l i t yi sk e p t k e yw o r d s :d b m s ,v i r t u a lm a c h i n e ,s t o r e dp r o c e d u r e ,t r i g g e r i i ! 独创性声明 本人声明所呈交的学位论文是我个人在导师指导下进行的研究工作及取得 的研究成果。尽我所知,除文中已经标明引用的内容外,本论文不包含任何其他 个人或集体已经发表或撰写过的研究成果。对本文的研究做出贡献的个人和集体, 均已在文中以明确方式标明。本人完全意识到本声明的法律结果由本人承担。 学位论文作者签名 摩键 日期:力舶年中月毋日 学位论文版权使用授权书 本学位论文作者完全了解学校有关保留、使用学位论文的规定,即:学校 有权保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅 和借阋。本人授权华中科技大学可以将本学位论文的全部或部分内容编入有关数 据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 保密口,在一年解密后适用本授权书。 本论文属于 不保密吼 ( 请在以上方框内打“4 ”) 学位论文作者签名虏健 f 1 期:砂中年细妒同 , j ,一冬 艚撕签名:三形号 目期:2 祝止年啦月毯指 华中科技大学硕士学位论文 1 1 课题的目的与意义 1 绪论 随着数据库应用复杂程度的提高,对安全和性能的要求也越来越高。早在存储 过程出现之前,不少文章就提出,应将过程结构引入到数据库管理系统之中,以部 分解决应用的高需求“。3 3 :文献 4 还论述了将过程融入到面向对象查询语言之中的 方法:文献 5 对过程结构的性能进行了分析。随着数据库技术的发展,早期的过程 扩展演变为功能更为强大、使用更为方便的存储过程。触发器也是一种特殊的存储 过程。 存储过程是指存储在服务器上的一段包含过程结构和s q l 语句的代码,可供具 有执行权限的用户反复调用。由此可见,通过存储过程可以将一部分应用逻辑从客 户端转移到服务器,同时通过存储过程的封装实现模块化“,有效地提高应用系统 的开发与运行效率。存储过程的引入对数据库系统的改进表现在7 个方面”“1 。 1 提高安全性 存储过程可以用来控制对数据库的访问。数据库管理员可以收回普通用户的所 有表访问权和视图访问权,仅仅允许通过存储过程访问数据库,简化了权限管理。 2 提升性能 由于存储过程中的s o l 语句一般是固定的,d b m s 可以为这些语句做预处理。对 于在线事务处理应用而言,编译s q l 语句的时间开销比例是很大的( 主要为查询计 划的生成) ,减少这部分时间可以带来性能的提升。 3 减少网络通信 一个慢速的网络连接可能会严重地影响数据库应用的性能。如果数据库应用客 户端对数据操作语句( d a t a m a n i p u l a t i o n l a n g u a g e ,d m l ) 使用不当,再加上网络拥 塞,将会导致数据库资源被长期占用。存储过程减少了客户端和服务器之间的数据 通信量。在理想状况下,一个用户请求对应一个存储过程调用。 4 方便性能调整 如果s q l 语句嵌入在客户端程序中,那么数据库管理员无法通过修改索引或重 写s q l 语句来调攘性能,除非重新编译客户端程序。通过使用存储过程,数据库管 理员可以调整数据库性能而无需改变客户端程序的源代码。 华中科技大学硕士学位论文 5 实现模块化 通过将s q l 语句置入存储过程,数据库应用可以采用并行开发模式。分为数据 库开发和客户端开发两部分同时进行。一个存储过程封装一个独立的功能。 6 避免死锁 如果整个数据库事务在一个请求中处理,那么可以简化死锁的避免。使用存储 过程就可以达到上述效果,并且还可以减少锁的持有时间,潜在地减小发生死锁的 可能性。一种避免死锁的方法是按照一致的顺序访问数据库资源,例如按字母顺序。 通过使用存储过程可以较容易地做到这一点。 7 实现引用完整性 引用完整性是保证在插入子元组时,有对应的父元组;在删除父元组时,没有 依赖其的子元组。因为这个逻辑的复杂性,在决定何时应该回滚或提交事务时,需 要多个数据库调用,降低了数据库系统的吞吐量。并且在代码的不同地方都需要保 持这种逻辑,导致了维护和配置的麻烦。存储过程和触发器提供了集中处理引用完 整性的能力,新的应用不用担心会破坏数据库。 本课题来源于国家8 6 3 计划数据库重大专项的要求。其目的是通过研究存储过 程的基本理论和实现机制,在现有的d m 3 数据库管理系统上进行相应扩展,使其支 持存储过程,更好地适应当前和今后的应用需求。 1 2 国内外发展概况 目前,国际上流行的商用数据库管理系统都提供了对存储过程的支持,为了统 一存储过程接口,s q i 一9 9 标准中提出了相关规定。在数据库管理系统中,实现存储 过程的关键是存储过程代码解释器的设计,虚拟机是一种有效的解释器架构。下面 介绍相关领域的国内外发展概况。 1 ,2 1 虚拟机技术 所谓虚拟机是指对真实计算机资源环境的一个抽象,它为解释性语言程序提供 了一套完整的计算机接口。虚拟机的思想对现在的编译有很大影响,其思路是先编 译成虚拟机指令,然后针对不同计算机实现该虚拟机。”1 。 虚拟机定义了一组抽象的逻辑组件,这些组件包括寄存器组、数据栈和指令集 华中科技大学硕士学位论文 等等。虚拟机指令的解释执行包括3 步: 1 获取指令参数; 2 执行该指令对应的功能: 3 分派下一条指令。 其中第一步和第三步构成了虚拟机的执行开销。 很多语言都采用了虚拟机作为运行环境“。作为下一代计算平台的竞争者,s u n 的j a v a 和微软的n e t 平台都采用了虚拟机技术1 。j a v a 的支撑环境是j a v a 虚拟 机( j a v av i r t u a lm a c h i n e ,j v m ) ,n e t 的支撑环境是通用语言运行库( c o m m o n l a n g u a g er u n t i m e ,c l r ) 。j v m 是典型的虚拟机架构1 。 j a v a 平台结构如图1 1 所示。从图中可以看出,j v m 处于核心位置,它的下方 是移植接口。移植接口由依赖平台的和不依赖平台的两部分组成,其中依赖于平台 的部分称为适配器。j v m 通过移植接口在具体的操作系统上实现。如果在j a v a 操作 系统( j a v ao p e r a t i o i ls y s t e m ,j o s ) 上实现,则不需要依赖于平台的适配器,因 为这部分工作己由j o s 完成。因此对于j v m 来说,操作系统和更低的硬件层是透明 的。在j v m 的上方,是j a v a 类和j a v a 应用程序接口( j a v aa p i ) 。在j a v aa p i 上 可以编写j a v a 应用程序和j a v a 小程序( a p p l e t ) 。所以对于j a v a 应用程序和a p p l e t 这一层次来说,操作系统和硬件就更是透明的了。我们编写的j a v a 程序,可以在任 何j a v a 平台上运行而无需修改。 图1 1j a v a 虚拟机 j v m 定义了独立于平台的类文件格式和字节码形式的指令集。在任何j a v a 程序 的字节码表示形式中,变量和方法的引用都是使用符号,而不是使用具体的数字。 华中科技大学硕士学位论文 由于内存的布局要在运行时才确定,所以类的变量和方法的改变不会影响现存的字 节码。例如,一个j a v a 程序引用了其他系统中的某个类,该系统中那个类的更新不 会使这个j a v a 程序崩溃。这也提高了j a v a 的平台独立性。 虚拟机一般都采用了基于栈的架构,这种架构易于实现“”“。虚拟机方法显 著提高了程序语言的可移植性和安全性,但同时也导致了执行效率的下降“”1 。目 前许多关于如何提高虚拟机性能的研究都在进行当中“”1 。 1 2 ,2 存储过程相关标准 s q l 语言本身不具有控制结构,它依赖于宿主语言来进行复杂操作。但是使 用宿主语言存在两个问题:s q l 语言的数据类型并不是完全和宿主语言一致,不一 致时必须在预编译阶段作类型转换,这可能导致数据的丢失;另一个问题是增加了 网络负担,降低了运行效率。例如当某个循环体中包含了几个查询语句,每执行一 次这个循环体就要通过网络向服务器提交这些查询语句供服务器编译执行。从而增 大了客户机与服务器之间网络传输的通信量,降低了系统的工作效率。 这些问题都可以通过引入存储过程来解决,这意味着s q l 语言需要扩充一些控 制结构。通常存储过程中应该包括条件语句、循环语句、赋值语句和带参数的查询。 s q l p s m ( s q l 一9 9 标准的一部分) 制定了一个用于编写存储过程的标准”“。 在这个标准中,存储过程被称为持久性存储模块( p e r s i s t e n ts t o r e dm o d u l e s ) 。 该标准主要包括如下内容: 1 变量和游标声明的语法和语义; 2 变量和参数赋值: 3 条件语句; 4 用于循环和分支的控制结构; 5 异常处理。 虽然s q l p s m 制定了详细的标准,但是这个标准出现得太晚,许多数据库产商 在这之前己经提供了存储过程的实现。所以数据库产商又提出了一个s q l j 标准。该 标准的目的是将j a v a 语言融入到数据库管理系统中,实现存储过程接口的统一“。 s q l j 是一系列关于j a v a 、嵌入式s q l 、关系数据库和对象一关系数据库应用的 标准。制定s q l j 标准的并不是5 a v a 标准化组织( j a v ac o m m u n i t yp r o c e s s ) ,而是 4 华中科技大学硕士学位论文 一个关系数据库厂商的联盟,即s q l j 联盟。把s q l j 标准整合到s q l 9 9 中的工作正 在进行之中。s q l j 由三部分构成,s q l jp a r t0 现在是s q l 一9 9 标准的一部分,p a r t l 和p a r t2 标准正在发展之中。o r a c l e 公司已提供了一个s q l jp a r t0 的参考实现。 1 2 3 国内外相关产品发展概况 在s q l p s m 发布之前,不同的d b m s 都提供了自己私有的“s q l 过程语言”。例如, o r a c l e 提供的是p l s q l 。”,s y b a s e 和s q ls e r v e r 提供的是t r a n s a c t s q l ”“,d b 2 支持 一种相当接近s q l p s m 的版本,t n f o r m i x 则提供了s p l 。国内也有数据库产品提供了 存储过程功能”。 下面以o r a c l e s d m ss q ls e r v e r 为例简述存储过程的发展概况。 1 o r a c l e o r a c l e 对s q l 进行了过程化扩展,定义了p l s q l 语言。p l s q l 提供了数据封 装、重载、集合类型、异常处理和信息隐藏。同时它还提供了无缝的s q l 访问,紧 密地与d b m s 及其周边工具结合在一起0 7 13 。 ( 1 ) 存储过程分类 o r a c l e 将存储过程称为存储予程序,并进行了扩展,引入了包的概念。包是由 存储在一起的相关对象组成的p l s q l 结构。包有两个独立的部分:包说明部分和包 体。这两部分独立地存储在数据字典中。 o r a c l e 支持c 和j a v a 扩展存储过程。c 扩展过程适合于高强度计算的情况;j a v a 扩展过程带来了可移植性和安全性。为了支持j a v a 过程,o r a c l e 实现了一个与d b m s 紧密地结合在一起的j a v a 虚拟机。 ( 2 ) 编译 在o r a c l e 中,使用命令c r e a t eo rr e p l a c e 创建子程序。子程序的源程序文本 和该子程序编译后的中间代码都存储在数据字典中。中间代码中含有子程序中经计 算得到的所有引用参数。 中间代码类似于由第三代语言生成的目标代码,也类似于j a v a 字节码。由于中 间代码带有经计算得到的子程序中的所有对象引用( 属于前联编的属性) ,中阕代 码的执行效率非常高。程序的源代码、编译后代码、编译状态以及全部编译错误都 存储在数据字典中。 5 华中科技大学硕士学位论文 o r a c l e 使用前联编技术,当对象变更时,其相关对象就会变成非法对象。当某 个存储子程序的相关对象被修改或删除后,例如在相关表中添加一列或删除相关表, 这个已编译存储子程序自动切换到非法状态。如果一个存储子程序处于非法状态, 在执行前必须由服务器自动重新编译或由它的定义者手工编译它。 ( 3 ) 调用 在o r a c l e 中调用子程序时,由服务器从磁盘读入中削代码并启动执行。一旦从 磁盘读入中间代码,服务器就将其存储在系统全局工作区( s y s t e mg l o b a la r e a ) 的共享缓冲区中,以便于多个用户同时进行访问。与对待缓冲区中的其他内容一样, 系统采用最近最少使用算法将过期的中间代码从共享缓冲区中清除。 o r a c l e 还提供了一个调用权的功能。借助于调用权,可以指定一个存储子程序 以定义者或者调用者的权限运行。 2 m ss q ls e r v e r 与o r a c l e 类似,m ss q ls e r v e r 也提供了一个s q l 语言的扩展版本t - s q l 。“1 。 所有同d b m s 交互的应用都使用t - s q l 语句完成对数据库的访问。 ( 1 ) 存储过程分类 m ss q ls e r v e r 中,存储过程主要分为两类:使用t - s q l 的、由服务器分析、 编译和优化的存储过程;以动态链接库形式出现的扩展存储过程。扩展存储过程一 般用c 或c 十+ 语言编写,它将服务器和操作系统结合起来,可以提供超出t - s q l 能 力的功能。m ss q ls e r v e r 还提供了对临时存储过程的支持。像临时表一样,临时 存储过程在一个连接结束后被删除。 ( 2 ) 编译 在m ss q ls e r v e r 中,使用c r e a t ep r o c e d u r e 创建存储过程,源程序经数据库 编译和优化后存储在数据库服务器中,可被其它程序调用。在6 5 和更早的版本中, 存储过程的编译过程还包含一个部分查询计划的预编译。数据库在编译存储过程的 同时创建个部分查询计划并存储到系统表中。执行个存储过程比执行一个s q l 语句序列要高效的多。服务器不需要从新完完全全构造一个查询计划,只需在已经 编译的部分上进行补充。在7 0 和2 0 0 0 的版本中,m ss q ls e r v e r 做了一些修改, 将存储过程的优势扩展到了一般s q l 语句处理上。数据库不再在创建存储过程时保 存部分查询计划,而是在执行时创建并缓存查询计划,便于在以后的执行过程中重 用这些查询计划。 华中科技大学硕士学位论文 由于m ss q ls e r v e r 的存储过程中支持数据定义语句( d a t ad e f i n i t i o n l a n g u a g e ) ,实现前联编有困难。相反,m ss q ls e r v e r 使用了延迟名字解析( d e l a y e d n a m er e s o l u t i o n ) 技术,直到运行时才确定名字与对象的对应关系,用灵活性换取 了部分性能。 ( 3 ) 调用 在m ss q ls e r v e r 中,重用编译过的查询计划可以使存储过程的执行效率得到 极大地提高,因为查询优化器节省了大量的分析编译时间。对于一个存储过程而言, 它实际上拥有的是一个复合查询计划,一个包含了存储过程中所有s q l 语句的查询 计划。 随着数据库系统的运行,数据库数据的某些改变将导致一个查询计划失效或低 效。服务器通过对一些统计数据的检查,对失效或低效的查询计划做出标记。这样 在下一次执行的时候,就必须通过重新编译来生成新的查询计划。这个重编译过程 可以由数据库系统自动进行,也可以由用户手工进行。对于那些查询计划频繁变化 的存储过程,用户可以禁止系统缓存该存储过程的查询计划。 m ss q ts e r v e r 使用定义者权限执行存储过程。 1 3 课题主要研究工作 本课题的主要目标是在d m 3 数据库管理系统的基础上实现对存储过程的支持。 在d m 3 中增加一个存储过程子系统专门负责存储过程的处理,保持d 1 1 3 其他部分不 受新增功能的影响。 存储过程子系统主要包括消息分发器、存储过程编译器、存储过程虚拟机、权 限管理模块、删除模块和数据字典。虚拟机由代码载入器、执行引擎和扩展存储过 程代理等组成。加上d m 3 核心模块提供的底层功能支持,存储过程子系统可以完成 存储过程的定义、删除、调用和权限管理功能。由于触发器是一种特殊的存储过程, 在虚拟机的设计实现中也提供对触发器的支持。 本文的主要工作包括6 个方面的内容。 1 研究存储过程技术发展的国内外概况,研究和比较国内外相关产品的解决方 案。 2 在系统原有的s q l 语言基础上进行扩展,参考相关标准制定一种适合编写存 华中科技大学硕士学位论文 储过程的语言。 3 分析比较j l 种解释器架构,为存储过程解释器选择适当的方案。 4 在保证效率和模块化的前提下,结合数据库系统的特点设计一个存储过程子 系统。尽量不影响原有系统,存储过程子系统与原有系统松散耦合。 5 讨论存储过程实现中的相关技术细节。 6 从虚拟机结构和存储过程特性两个方面入手对方案进行优化,并给出测试结 果。 华中科技大学硕士学位论文 2 存储过程子系统的设计 本章讨论存储过程子系统的总体设计。 虚拟机结构和存储过程子系统的整体架构。 发器的实现。 2 1 存储过程语言d m p l s q l 主要介绍d m 3 存储过程语言d m p l s q l 、 还将讨论存储过程权限模型的选择和触 在关系数据库管理系统中,主要以嵌入方式使用s q l 语言,即将s q l 语句嵌入 在应用程序的宿主语言中,执行时由宿主语言的预编译器将嵌入的s q l 语句翻译成 对a p t 的调用,从而实现应用程序对数据库的操作与访问,但此时的操作控制流逻 辑完全是由宿主语言实现的。 数据库应用复杂度的提高导致了对复杂存储过程和触发器的需求。这需要对 s q l 语言做一些扩充,使之包括一些过程化的结构。如:语句块、局部变量、赋值 语句、条件语句和循环语句。文献e 3 2 中提到的几种数据库语言都提供了类似的结 构。 d m 3d b m s 采用d m p l s q l 作为它的存储过程语言。d m p l s q l 在s q l 语言的基础 上扩充了面向过程的程序结构,实现了s q l 与过程结构的无缝集成,可以编写出功 能强大的存储过程。由于它类似于p a s c a l 的过程,也是用户易于使用的一种结构化 程序设计语言。 2 1 1d m p l s q l 的组成 d m p l s q l 主要包括5 种结构。 1 块结构 d m p l s q l 程序的基本结构是块。块包括声明部分、语句部分和异常处理部分。 所有d m p l s q l 程序都是由块组成的,块之间可以相互嵌套。通常程序中的每个块都 实现一个逻辑操作,从而把不同的任务进行分割,由不同的块来实现。过程和函数 是特殊的块结构,统称为子程序。例如: b e g i n s e i ,e c tv a l l j ei n t o :af r o mo r d e rw h e r eo r d e r e d = :b : 9 华中科技大学硕士学位论文 e n d : 2 变量和类型 数据库系统与d m p l s q l 程序之间通过变量进行信息传递。所谓变量就是可以由程 序读取或赋值的存储单元。通常,变量在o m p l s q l 块的声明部分定义。每个变量都有 一个特定的类型与其关联,变量的类型决定了变量可以存放的信息类型,d m p l s q l 变 量支持d m 3d b m s 所有的类型。例如: ai n l :; bc h a r ( 1 ) : 3 异常处理 d m p l s q l 块的异常处理部分用来处理程序运行过程中遇到的错误,把程序的主体 部分与错误处理代码相互隔离。这样使程序的结构看起来十分清晰。例如: b e g i n s e l e c tv a l u ei n t o :af r o mo r d e rw h e r eo r d e r e d = :b : e x c e p t i o n 此处作异常处理 e n d : 4 循环结构 所谓循环就是指可以重复执行的同代码段。d m p l s q l 支持多种循环结构,如 w h i l e 、f o r 和l o o p 。例如: l o o p i fa 0t h e n e x i t ; e n di f ; a := a 一1 : e n dl o o p 5 游标 游标是用来处理使用s e l e c t 语句从数据库中检索到的多行记录的工具。借助于 游标的功能,d m p l s q l 程序可以对一组记录逐个进行处理,每次处理一行。例如: c u r s o rc 1i ss e l e c t f r o me m p : 华中科技大学硕士学位论文 2 12d m p l s q l 的特性 1 支持存储过程和存储函数,统称为存储予程序。存储过程只能作为单独的 语句调用,而存储函数可以用于表达式中。在本文中如果没有特别说明,存储过程 包括存储函数和存储过程。 2 支持3 种类型的参数:i n 、o u t 和i n o u t 。i n 类型只能作为输入参数,不能 在存储过程内部修改;o u t 类型只能作为输出参数,不能对这种类型的参数作读操 作;i n o u t 类型可以作为输入参数或输出参数。存储过程也可以不带参数。 3 支持嵌套调用。如果是直接递归调用,则递归层次仅仅受数据栈大小的限 制。最多支持3 2 个不同存储过程的嵌套调用。 4 支持一般的事务处理语句,如提交和回滚事务操作。 5 可以包含创建数据库对象的s q l 语句,如创建表和视图。 6 依赖性检查在运行时进行,即采用了延迟绑定的方法。 2 2 虚拟机架构 实现存储过程的关键是如何执行d m p l s q l 语句,即如何设计一个解释器。一般 而言,有三种类型的解释器:字符串解释器( s t r i n gi n t e r p r e t e r ) 、树结构解释器 ( t r e ei n t e r p r e t e r ) 和虚拟机( v i r t u a lm a c m n e ) 。 2 2 1 解释器类型的选择 字符串解释器直接对程序源代码解释执行。由于程序源代码是文字形态,一边 解读一边执行,速度非常慢,常常是用在剖析源码上耗费的时间远比真正执行计算 所需的时间还要多,因此,它只适合于简单的命令语言,如配置文件,而不适合具 有复杂语法结构的语言。 树结构解释器对程序按树形表示方式进行解释执行,因此,在执行前要对源代 码进行编译,生成分析树或者抽象语法树方可。 最常见的解释器形式是虚拟机。虚拟机用软件方式实现了一个理想化的计算机 架构,它为解释性语言程序提供一套完整的计算机接口。虚拟机指令一般是以字节 为单位的,称为字节码( b y t e c o d e ) 。一条虚拟机指令的解释执行包含3 步1 : i 访问指令操作数; 华中科技大学硕士学位论文 2 执行该条指令的功能; 3 分派( d i s p a t c h ) 下一条指令。 虚拟机对字节码序列进行解释执行,程序的处理分成两个步骤。在第一个步骤 中,先剖析程序的文字内容,进行某些分析,再翻译成虚拟机指令。程序被重组成 有效率的文件。程序执行前,这个步骤只需要进行一次。编译阶段已经把最耗时间 的部分处理完了,所以以后执行的速度会比较快。接下来在第二个步骤中,就可以 执行虚拟机指令( 也就是在第一阶段产生的字节码) ,不用再分析源码。虚拟机一步 一步解读每个字节,实现要求的动作。同前面两种解释器相比,虚拟机速度更快, 产生的代码更简洁。虚拟机还具有其它一些特点。 1 由于字节码与一般编译中的中间代码比较接近,可以采用常见的编译技术进 行优化。 2 如果采用语法树形式,在保存到数据字典之前需要进行串行化处理。同理, 从数据字典中读取之后,也需要重新还原成语法树。如果采用字节码的形式就无需 这些重复的转换处理。 3 越来越多的数据库管理系统开始提供对j a v a 虚拟机的支持。虚拟机架构的 通用性使之能够处理多种语言。本文采用基于虚拟机的方法可以为以后在d m 3 中实 现j a v a 虚拟机提供借鉴。 基于以上原因,本文采用了虚拟机架构对d m p l s q l 语言进行处理。 2 2 2 虚拟机结构 在计算机硬件领域,基于寄存器的架构已经压倒基于栈的架构成为当今的主流, 但是在解释性的虚拟机领域,基于栈架构的实现占了上风“”。 1 从编译的角度来看,许多编程语言可以很容易地被编译成栈架构机器语言。 如果采用寄存器架构,编译器为了获得好的性能必须进行优化,如全局寄存器分配 ( 这需要对数据流进行分析) 。这种复杂的优化工作使虚拟机的便捷性大打折扣。 2 如果采用寄存器架构,虚拟机必须经常保存和恢复寄存器中的内容。与硬件 计算机相比,这些操作在虚拟机中的开销要大得多。因为每条虚拟机指令都需要 进行很费时的指令分派操作。虽然其它的指令也要分派,但是它们的语义内容更丰 富。 华中科技大学硕士学位论文 3 采用寄存器架构时,指令对应的操作数位于不同寄存器中,对操作数的寻址 也是一个问题。而在基于栈的虚拟机中,操作数位于栈顶或紧跟在虚拟机指令之后。 由于基于栈的架构的简便性,一些查询语言的实现也采用了此种架构。“。 考虑到上述这三个原因,d m 3 存储过程虚拟机采用了基于栈的架构。 用d m p l s q l 编写的存储过程经过编译后生成虚拟机指令,存放于d b m s 数据字典 中,在以后被调用时由虚拟机解释执行。虚拟机指令类似于j a v a 的字节码。 虚拟机采用了面向栈的体系结构,只设置了数量很少的寄存器。虚拟机定义了 一组抽象的逻辑组件,这些组件包括寄存器组、数据栈、代码栈,寄存器栈、基址 数组( d i s p l a y ) 、异常处理器字典和代码缓存区。同时虚拟机内部还包括一些辅助 模块,如代码载入器和扩展存储过程代理。虚拟机内部结构如图2 1 所示。 动态链接库 图2 1 虚拟机内部结构 寄存器包括指令指针寄存器、数据栈指针寄存器,还有一些特定于存储过程的 寄存器。任何时候虚拟机都是在执行一个单独的存储过程的代码,指令指针包含下 一个要执行的指令的地址。局部变量和参数的大小在编译时就可以得到,因而在编 译时就可以确定存储过程的活动记录,因此为存储过程分配空间是很方便的。 数据栈用于提供操作数、返回运行结果和为存储过程传递参数等。这些数据构 成活动记录的一部分内容。存储过程的调用和返回在数据栈中直接表现为活动记录 华中科技大学硕士学位论文 的入栈和出栈。虚拟机指令的操作数来自数据栈顶,或者紧跟在指令操作符后面。 虚拟机对它们进行运算,并把结果返回到栈顶。例如,a d d 指令将两个数相加。相 加的两个数应该是数据栈顶的两个节点,这两个节点是由先前的指令压进栈的。这 两个数从数据栈弹出、相加,然后结果被压回到数据栈中。 考虑到存储过程之间的相互调用,需要动态地从数据字典中载入虚拟机指令, 所以为虚拟机指令单独设立了一个代码栈。代码栈中每个节点用于存放编译后的虚 拟机指令序列的引用( 在代码缓存区中的位置) 。每个被调用的存储过程的代码的引 用按照调用顺序被压入代码栈,调用结束后被弹出、释放。 d m p l s q l 支持嵌套定义过程,且内嵌的子过程可以访问外层子过程的变量,所 以在虚拟机中对变量的访问是通过基址加偏移的方式来实现的。基址为定义变量的 子过程的活动记录的首地址。基址数组( 即d i s p l a y 向量) 用于保存各层次子程序 对应的基址。基址数组随着动态调用链的变化而变化。 寄存器栈用于保存和恢复虚拟机各寄存器的值。异常处理器字典中存放当前正 在运行的存储过程的异常处理信息。 代码缓存区中保存存储过程字节码、异常处理器信息和存储过程中s q l 语句的 查询计划。 执行引擎负责从代码缓存区中依次读入代码解释执行。执行过程中使用的参数 和局部变量存放在数据栈中,同时数据栈还提供运算的临时存储区。对于带查询条 件的s q l 语句,执行引擎还要将查询计划存入代码缓存区。 代码载入器负责从数据字典中读取编译后的存储过程代码和异常处理信息,存 入代码缓存区以备下次执行时提高载入速度。代码载入器把该存储过程代码的引用 压入代码栈中,供执行引擎调用。同时还把异常处理信息填入异常处理器字典中。 扩展存储过程代理负责载入动态链接库,调用其中的扩展存储过程,并与执行 引擎交换信息。考虑到安全性,代理与d b m s 其它模块在不同的进程空间中运行。目 前d m 3 只支持c 扩展存储过程。 图2 2 为虚拟机的内部数据结构图,假设此时存储过程a 调用了存储过程b , 存储过程b 又调用了内嵌的子过程c 。 指令集中的指令包含单字节的操作码,用于指定要执行的操作。还有零或多个 操作数,提供操作所需的参数或数据。许多指令没有操作数,仅由单个字节的操作 码构成。例如,指令a d d 是把两个栈顶操作数相加。 4 华中科技大学硕士学位论文 第2 层基址 第l 层基址 第o 层基址 基址数组 ( d i s p l a y ) 数据栈指针 f 存器栈指针 b 的寄存器组 a 的寄存器组 f 栈增 寄存器栈 表达式求值的 临时存储区 局部变量 实参 函数返回值 存储过程信息 数据栈 b 的代码 1 。的黼拥 a 的代码 r _ 一 a 的代码引用 图2 2 虚拟机内部数据结构 虚拟机指令集主要包括2 部分。 1 s q l 指令:如e x e s q l 、d y n s q l 和d y n c u r 等等。 2 常规指令:如a d d 、p u s h 和3 m p 等等。 指令还可以细分,如表2 1 所示。 表2 1 虚拟机指令 c 的活动 c 己录( 第 l 层) b 的活动 记录( 第 0 层) a 的活动 记录( 第 o 层) 指令类型 指令个数指令举例 s q l 指令 3 e x e s q l 、d y n s q l 、d y n c u r 数学计算 5a d d 、s u b 、m u l 等 关系运算 9g t 、b e t w e e n 、i n 等 逻辑操作 7a n d 、0 r 、n o t 等 堆栈处理 3p u s h 、p o p 、m o v e 流程控制 8 j m p 、b e g 、r e t 等 局部变量处理 4v a r 、a r g 、r e t t y p e 等 调用 2c a l 、c a li n 触发器 5t r i g g e ri n s e r t 、r e a d _ r e c 、w r tr e c 等 华中科技大学硕士学位论文 表2 1 虚拟机指令( 续表) l指令类型指令个数 指令举例 l 其它 1 9r a i s e 、u p e x e c 、h d s p 等 _ 虚拟机并不直接处理$ q l 语句,而是对s q l 语句进行预处理后交给d b m s 核心模 块执行。 2 3 总体结构 为了给存储过程和触发器提供更好支持,d m 3 对现有的d m 3s q l 语言进行了扩 充,加入了一些过程化结构,形成了d m p l s q l 语言。存储过程和触发器就是用 d m p l s q l 编写的程序段。现在的问题是如何在已有的d m 3s q l 语句处理引擎上加入 对过程化语句的支持。考虑到之前的s q l 引擎非常复杂,且已经比较完善,同时考 虑到系统的模块化要求,因而在d m 3 系统中增加了一个存储过程子系统,由该子系 统负责存储过程的处理。存储过程子系统由六部分组成:消息分发器、存储过程编 译器、权限管理模块、删除模块、存储过程虚拟机和数据字典。存储过程子系统的 总体结构如图2 3 所示。 根据上述设计思路,对存储过程的处理实际上分成了两部分:过程化结构由存 储过程子系统处理:普通s q l 语句首先由存储过程子系统进行预处理( 如替换变量) , 然后再提交给d b m s 核心模块的s o l 引擎处理。 在d m 3 系统中,客户端提交的请求都是首先由预编译子系统组成消息体后才交 给核心模块执行的。存储过程子系统中的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025内蒙古呼伦贝尔市莫力达瓦达斡尔族自治旗招募特聘农技员2人笔试考试参考题库及答案解析
- 2025四川省现代种业发展集团有限公司部分权属企业社会化招聘13人考试笔试备考试题及答案解析
- 2025年丽江市宁蒗县纪委监委招聘公益性岗位人员(1人)考试笔试参考题库附答案解析
- 2025江苏苏州工业园区翡翠幼儿园教学辅助人员招聘1人考试笔试模拟试题及答案解析
- 2025南昌市育新学校红谷滩分校招聘劳务派遣人员考试笔试参考题库附答案解析
- 2025福建泉州城建集团人才引进1人考试笔试模拟试题及答案解析
- 2026年陕西省选调生招录(面向华中科技大学)笔试考试备考题库及答案解析
- 2026中国能源建设集团云南省电力设计院有限公司招聘笔试考试参考题库及答案解析
- 2025下半年四川艺术职业学院考核招聘工作人员15人笔试考试备考试题及答案解析
- 山东省菏泽市单县第五中学高二下学期第二次月考(月)英语试题
- 水闸安全管理办法
- 2025中华护理学会团体标准-成人患者医用粘胶相关性皮肤损伤的预防及护理
- 雨课堂学堂在线学堂云《SPSS在医学统计中的应用(首都医大 )》单元测试考核答案
- 药剂证书考试题库及答案
- 绳锯施工方案及现场安全操作标准
- 江苏省2026年普通高中学业水平合格性考试英语仿真模拟卷01(春季高考适用)(全解全析)
- 14-GP12控制作业指导书
- 混凝土表面缺陷修补方案
- 2023数字图像处理重修试题
- HY/T 0330-2022海滩养护与修复工程验收技术方法
- 中药材的采收与加工
评论
0/150
提交评论