一种关于分布式查询技术的实现方法
1、 开发背景近年来,随着分布式系统广泛使用,分布式数据库已经成为信息处理的一个重要领域。分布式查询是一个主要问题,和用户之间的分布式数据库的数据访问接口的分布式数据库,分布式查询的透明度,允许用户直接去面对整个系统,掌握系统的整体宏观经济形势[ 1]。本文以分布式粮油储备管理系统为背景,针对系统SQL Server数据库中分布式查询功能的不足,在SQL Server数据库平台上开发分布式查询处理器,通过分布式查询器,用户可以在完全不考虑数据分布的状况下,方便获取全局数据库的查询结果。 2、 分布式查询处理器的结构设计分布式查询处理器两部分组成,包括全局和局部的查询处理器。全局查询处理器接收全局SQL语句,根据数据目录中逻辑片段、物理副本、站点等信息,将此全局SQL语句分解成若干个局部SQL语句,再将这些局部SQL语句通过网络发送到相应的数据库站点,各站点接收到局部SQL语句后交给局部DBMS执行,局部DBMS执行后的各局部结果集汇总成全局结果集,并通过网络返回给客户端应用程序。 2.1全局查询处理器体系结构全局查询处理器由两个消息队列(QueneSendMsg、QueneReceiveMsg)和三类线程(Receive()、Gtransact()、Send())组成。QueneSendMsg存放待发消息,QueneReceiveMsg存放接收的消息。全局查询处理器的结构如图2所示。Receive()线程从QueneReceiveMsg读取消息后,将这些消息分别发送给各自的Gtransact()线程;Gtransact()线程分解及优化全局SQL,产生局部SQL语句,发送局部SQL语句到相应的局部查询处理器中,组装由局部查询处理器返回的结果集;Send()将QueneSendMsg中的消息发送出去。全局查询处理器输入的是GSQL、LTMR,输出的是LSQL、GTMR。在一个全局查询处理器中, QueneSendMsg队列、QueneReceiveMsg队列、Receive()线程、Send()线程只有一个,Gtransact()线程的个数取决于正在处理的全局查询SQL语句的数量。 2.2局部查询处理器的结构局部查询处理器由两个消息队列(QueneSendMsg、QueneReceiveMsg)和三类线程(receive()、ltransact()、Send())组成。QueneSendMsg队列存放LTMR, QueneReceiveMsg队列存放LSQL语句。局部查询处理器的结构如图3所示。Receive()线程从QueneReceiveMsg中取得消息,如果是LSQL消息,则建立一个新的Ltransact()线程,将该LSQL消息发送给对应的Ltransact()线程;Ltransact()线程通过ODBC负责LSQL执行,将执行后的LTMR加入QueneSendMsg队列中;Send()线程从QueneSendMsg队列中取出消息,如果是LTMR消息,则获取消息的目的IP,把消息发送到对应的全局查询处理器。局部查询处理器输入的是LSQL,输出的是LTMR。在一个局部查询处理器中,QueneSendMsg队列、QueneReceiveMsg队列、Receive()线程、Send()线程只有一个,Ltransact()线程的个数取决于正在处理的局部查询SQL语句的数量。 2.3消息结构 GSQL用来存放全局SQL消息内容,它由客户端应用程序产生。其结构定义为:消息类别、发送消息机器的IP地址、消息发送到机器的IP地址、全局SQL语句的内容。 LSQL用来存放局部SQL消息内容,它由全局查询处理器产生。其结构定义为:消息类别、发送消息机器的IP地址、消息发送到机器的IP地址、局部SQL语句的内容。 GTMR用来存放全局结果集,它由全局查询处理器产生。其结构定义为:消息类别、发送消息机器的IP地址、消息发送到机器的IP地址、表的列数、表的行数、表字段信息(名称、长度、类型)、数据信息。 LTMR用来存放局部结果集,它由局部处理器产生。其结构定义为:消息类别、发送消息机器的IP地址、消息发送到机器的IP地址、表的列数、表的行数、表字段信息(名称、长度、类型)、数据信息。 2.4数据结构数据目录中存储和分布式数据库系统的各种控制信息的对象和地方。它包括不仅数据库,域名,关系,属性,用户等不透明的水平,而且碎裂的描述,位置描述段,图像的本地名称和全球的用户访问等。这个目录结构的设计如下:①该网站的基本信息表(Siteinfo):站点数量,站点名称,服务器IP,端口号,连接密码,注释。 ②全球逻辑模型表(LogicTabInfo):表名,字段名,数据类型,数据宽度,备注。 ③分段结构表(SegTab):段落标记,表名,字段名,分条件。 ④图像结构表(ImageTab):形象标志,节标志,站点数目,形象的描述。 ⑤局部图像结构表(NativeImageTab):标志图像数据源别名表的名称。 ⑥数据源的信息表(DsInfo):数据源的别名,用户登录,密码。对于每一个网站可以通过本地目录查询系统获取数据的分割和分配信息,以完成全球的查询,该网站的基本信息表,全球的逻辑模型的形式分段结构表和图像的表结构在每个网站上存储数据的目录重复,这样的网站,可以降低成本目录之间的互访。局部图像的结构和数据结构表的表只能用本地的DBMS,只要到本地目录就可以了相关的数据存储网站。 3、分布式查询处理器执行 3.1分布式查询处理器线程控制分布式查询处理器的线程控制分为全局查询处理器的线程控制和局部查询处理器的线程控制。全局查询控制处理器线程的实现过程为:(1)Receive()线程的执行流程:从QueneReceiveMsg队列中取出消息,根据消息的类别做相应的处理。如果是GSQL消息,则先建立一个新的Gtransact()线程,再把GSQL消息发送给该线程;如果是LTMR消息,则先根据消息结构的内容找到对应的Gtransact()线程,再把LTMR发送给该线程。Receive()线程在程序启动后就一直运行,直到程序退出。(2)Gtransact()线程的执行流程:该线程一旦检测到有消息,根据消息类别做相应的处理,如果是GSQL消息,则先进行GSQL语句的词法分析、语法分析、转换查询树以及优化等操作,得到多条LSQL内容以及多个要执行LSQL处理的站点信息(IP地址、端口等信息),再把各个LSQL消息加入到QueneSendMsg队列。如果是LTMR,则先把LTMR汇总成GTMR,再把该GTMR消息加入到QueneSendMsg队列。Gtransact()线程从建立后就一直运行,直到全局查询任务执行完毕才释放。(3)Send()线程的执行流程:从QueneSendMsg队列取出消息,根据消息的类别做相应的处理,如果是GTMR消息,则从消息内容中获取目标IP地址,先建立对应的ClientSocket,再把消息发送到客户端应用程序。如果是LSQL消息,则从消息内容中获取目标IP地址,先建立对应的ClientSocket,再把消息发送到局部处理器。Send()线程在程序启动后就一直运行,直到程序退出。局部查询处理器的线程控制实现过程为:(1)Receive()线程的执行流程:从QueneReceiveMsg队列取出消息,如果是LSQL消息,则建立一新的Ltransact()线程,把LSQL消息发送给该Ltransact()线程。Receive()线程在程序启动后就一直运行,直到程序退出。(2)Ltransact()线程的执行流程:该线程收到LSQL消息后,先在该站点执行局部查询,生成LTMR消息,再把消息加入到QueneSendMsg队列。Ltransact()线程从建立后一直运行,直到对应的LSQL语句执行完毕才释放。(3)Send()线程的执行流程:该线程从QueneSendMsg队列取出消息,如果是LTMR消息,则先从消息结构内容中获取目标IP地址,建立对应的Clientsocket,通过该Socket把LTMR消息发送到对应的全局处理器上。Send()线程在程序启动后就一直运行,直到程序退出。 3.2分布式查询处理器的消息通信 本文采用Delphi提供了Winsock编程组件TClientSocket和TServerSocket实现全局查询处理器与局部查询处理器、全局查询处理器和客户端应用程序之间的消息通信。全局查询处理器是客户端应用程序的服务器,局部查询处理器是全局查询处理器的服务器。这里只介绍全局查询处理器的Socket管理机制。(1)接收消息:在全局查询处理器上静态建立一TServerSocket组件Sersocket,端口号定为2001,它用来接收客户端应用程序发送过来的GSQL消息和局部处理器发送过来的LTMR消息。当客户端应用程序的TClientsocket组件或者局部查询处理的TClientsocket组件建立一连接时,就增加一个TCustomWinsocket实例。在程序中可以根据Sersocket.Connections属性读取该Socket实例的相关信息(包括该Socket的本地IP地址、远程IP地址,本地的端口号与远程端口号等)。另外在OngetSocket事件中,将收到的消息加入QeneReceiveMsg队列中。(2)发送消息:对于GTMR消息发送给客户端应用程序或者LSQL消息发送到给局部处理器,在程序中可动态建立一个TClientSocket组件Clisocket, Clisocket.Address设置为消息的目标IP地址,端口号根据消息类型而定,如果是GTMR,它对应端口号为客户端应用程序TServerSocket组件的端口号2002,如果是LSQL,端口号为局部处理器中TServerSocket组件的端口号2000。当消息发送成功,该Socket连接就被解除。 3.3全局查询语句到局部查询语句的转换全局查询语句到局部查询语句的转换分为以下六个步骤:(1)将全局SQL语句转化为全局查询树:当全局处理器接收到一条全局SQL语句后,首先要对该全局SQL语句进行词法分析和语法分析,一方面得到所需数据的存放全局表名,另一方面将SQL语句转换成语法树,然后对语法树进行语义分析,最后生成查询树;(2)将全局查询树转化为段查询树;(3)对段查询树进行代数优化;(4)对段查询树进行分解定位优化;(5)对段查询树进行半连接优化;(6)将段查询树转化为局部SQL语句。 4、 小结当今人类社会已经进入信息化时代,信息量的剧增以及公司和集团跨地区发展使信息数据的查询成为人们很繁重的任务。目前SQL Server数据库也提供分布式查询功能,但没有完全解决分布式查询的段透明性问题,本文在SQL Server数据库平台上开发分布式查询处理器,弥补了SQL Server数据库中分布式查询功能的不足,提高了粮油储备管理系统分布式查询的效率。参考文献 [1] 李春生、罗晓沛,基于_NET实现分布式数据库查询,计算机工程与设计,2007.6 [2] 凌波 周水庚 周傲英,P2P信息检索系统的查询结果排序与合并策略,计算机学报,2007.3 [3] 陈冬林、黎志成,基于分布式数据库的综合系统管理的实现,华中科技大学学报,2001.03 [4] 吴洪潭、吕青毅、丁文,高考招生信息的分布式查询技术,中国计量学院学报,2000.12 [5] 佩英著,分布式数据库系统及其应用,北京:科学技术出版社,2000
- 上一篇:差分隐私二维数据流统计发布
- 下一篇:试析计算机数据库的备份及恢复技术