《电子技术应用》
您所在的位置:首页 > 通信与网络 > 设计应用 > 基于XML异构数据访问中间件的设计与实现
基于XML异构数据访问中间件的设计与实现
杨金玺1,2,柏文阳1
1.南京大学 计算机科学与技术系,江苏 南京210093; 2.大庆榆树林油田开发有限责任公司,黑龙
摘要: 提出了一个基于XML的异构数据访问中间件模型,给出了该模型的体系结构并对各部分功能做了定义。详细介绍了模型中XML模板与包装器的设计和实现。
Abstract:
Key words :

摘  要: 提出了一个基于XML的异构数据访问中间件模型,给出了该模型的体系结构并对各部分功能做了定义。详细介绍了模型中XML模板与包装器的设计和实现。
关键词: XML语言  中间件  异构数据

  随着信息化建设的不断深入,不少企业与组织建立了各种应用系统。由于这些系统是在不同阶段开发的,每个系统都有自己的运行环境和数据存储方式,这些数据的格式不统一,各个应用系统彼此封闭,数据难以交换和共享。为了使这些数据能够更好地实现资源共享,迫切需要建立一个公共的集成环境,对用户提供统一和透明的访问界面。利用中间件(Middleware)技术集成各种异构数据时,不用改变原始数据的存储和管理方式,可集中为异构数据源提供一个统一的高层检索服务,是实现异构数据集成的理想解决方案。
异构数据访问中间件系统的核心就是要解决异构数据源的分布性、自制性和异构性。随着分布式计算技术(如CORBA、XML等)的迅猛发展,使得原来的系统可以通过它们进行封装,隐藏内部结构,采用公共数据模型将局部共享数据进行封装,对外提供公共访问接口。异构数据访问中间件为企业提供一致的、便于访问的数据集合,从而解决信息孤岛、数据质量差、数据不一致等问题。
1  XML全局数据模式
  异构数据访问中间件必须提供一种全局数据模式来统一异构源数据模式。异构数据集成的全局模式必须满足:①能够描述各种数据格式,无论其为结构化还是半结构化,无论它是支持所有的查询语言还是简单的文本查询;②易于发布和进行数据交换,集成后的数据可以方便地以多种格式发布和便于应用交换数据。
早期异构数据的集成系统通常采用关系或对象的数据模式作为全局模式。然而,它们并不能满足网络时代的Intranet/Internet应用所提出的高标准。随着可扩展标记语言XML及其相关技术的发展,XML不仅成为了应用间交换数据的一种标准,也是万维网重要的信息交换标准和表示技术之一[1]。
XML是一种具有很强的数据描述能力的标记语言,它第一次提供了一种信息交换模式,此格式是可编辑、易理解并且可表示任何类型的结构化或半结构化的信息。XML 提供了丰富的数据构造和解析方法,能够适应多样并且不断变化的网络应用环境,被广泛用于异构系统间的数据交换和互操作应用中。
2  系统框架
  中间件是一种支持分布式应用的重要组件,它是一种独立的系统软件和服务程序。分布式应用借助中间件在不同的技术间共享资源,为应用提供统一的编程模型,处理异构、分布问题和管理计算资源及网络通信。
  大多数基于 XML 的数据集成系统框架采用Mediator/Wrapper架构,该架构的缺点是查询效率不高。这是由于底层数据源的数据结构、数据模式、存储方法、查询能力差别很大。数据访问中间件的设计是非常复杂的,包装器同时要兼顾数据转换、数据清洗等任务,并且这还仅是在查询时触发的处理。为此本文采用从原始数据源中预先抽取、转换、加载的思想,对数据源作预处理。
  基于XML的异构数据访问中间件模型XHDAM(XML-based Heterogeneous Data Access Model)的系统结构如图1所示。XHDAM从分布式对象操作和异构数据集成二个方面解决系统互操作问题。首先,XHDAM基于CORBA技术,通过CORBA提供的ORB(Object Request Broker)实现分布计算环境中对象操作支持,使不同的应用系统能够方便地与XHDAM交互,达到不同应用系统之间交互的目的,从而实现系统的透明性。另外CORBA提供了完整的分布式对象操作环境,XHDAM通过它可以方便地获得操作的完整性和安全性保证。另一方面,在系统间数据传递与互操作上,XHDAM采用XML作为数据描述与交换的语言,同时在XHDAM中通过XML模板来描述异构系统之间数据的关系和转换方法。只要适当地定义统一的模板,一种系统的数据就能够方便、准确地转换为XML数据。

  (1)客户端:向CORBA服务器发出访问请求。客户端只提供统一的访问界面,不处理业务逻辑关系和集成管理任务。
  (2)CORBA公共服务:提供CORBA的标准服务,包括名字服务、事件服务、安全服务等。
  (3)查询处理器:当客户请求时,分解全局查询到局部查询;当查询结束时,负责将局部查询结果汇总返回给客户端。另外还负责局部查询的优化,提高查询效率。
  (4)目录服务:是XML存储库的一个摘要,包含XML存储库的静态和动态信息。XML数据目录服务可以自动、智能地建立目录服务,并对信息自动搜索、自动分类、自动传输。
  (5)事务服务:负责全局模式和局部模式之间的集成与分解关系,如全局事务到局部子事务的处理,全局查询到局部子查询的处理。
  (6)包装器:负责解决异构数据源的包装问题,将分散在各处的数据源按照XML模板进行包装。开始,包装器一次性将数据源中的所有数据转换到存储库中。当有新数据源追加到源数据库时,就通过触发器触发包装程序将源数据库中的新数据包装成XML数据加入存储库。客户端对数据的访问是通过查询处理器访问XML存储库实现的。
3  XML模板和包装器的设计与实现
  为了提供对XML 的支持,各大数据库厂商纷纷对各自的数据库产品进行了扩展,提供了基于模板的查询。但各数据库管理系统支持的查询模板语法差异很大,不能互用。因此,访问多个异构数据源时需要为不同类型的数据库提供多个符合其相应语法的模板文件,这就增加了项目开发的复杂度。针对各数据库管理系统不能互用的问题,提出一种独立于具体数据库管理系统的模板脚本语言XTemplate,以支持各种结构化数据源的包装。包装器按照XML模板的数据模式将异构数据源中的数据包装成XML数据。
3.1 XTemplate模板设计
  为了访问不同的数据源,需要在模板文件中定义数据源的连接属性。其中:数据库连接属性包括servername、dbparm、database、logid、logpass、autocommit;代码SQL语句属性为xviewsqlcode;视图名称属性为xviewname;视图SQL语句属性为xviewsql。表达式中的Eq和Attvalue含义分别来自XML元语言[xml25]和[xml10]。
  [1]ServernameAttr∷=′xviewsqlcode′ Eq AttValue
  [2]DbparmAttrr∷=′xviewsqlcode′ Eq AttValue
  [3]DatabaseAttr∷=′xviewsqlcode′ Eq AttValue
  [4]LogidAttr∷=′xviewsqlcode′ Eq AttValue
  [5]LogpassAttr∷=′xviewsqlcode′ Eq AttValue
  [6]AutocommitAttr∷=′xviewsqlcode′ Eq AttValue
  [7]XviewnameAttr∷=′xviewname′ Eq AttValue
  [8]XviewsqlAttr∷=′xviewsql′ Eq AttValue
  [9]XviewsqlcodeAttr∷=′xviewsqlcode′ Eq AttValue
  XTemplate 对XML元语言中的起始标签Stag[xml40]作了如下扩展,其中Name、S、Attribute分别来自[xml15]、[xml3]和[xml41]:
  Stag∷=′<′ Name (S XviewnameAttr | S XviewsqlAttr | S XviewsqlcodeAttr | S Attribute)*? ′>′
  最后,XTemplate 模板文件定义如下,其中prolog、element分别来自[xml39]和[xml22]:
  xtemplatefile∷=prolog ′<xtemplate′ [ServernameAttr] [DbparmAttr] [DatabaseAttr] [LogidAttr] [LogpassAttr] [AutocommitAttr]> [element] ′</xtemplate>′
  使用XTemplate定义的模板文件是格式正确(Well-formed)的XML文档,且具有根元素<xtemplate>,可用来提供数据源连接参数servername、dbms、dbparm、database、logid、logpass、autocommit。
具有xviewname属性和xviewsql属性的子元素称为视图模板元素,因为其提供了表征数据集的名称和SQL语句的二个属性。xviewname属性提供视图名称,xviewsql属性提供视图SELECT语句。SELECT语句中可以用:p_xviewname:p_columnname的形式传递父视图的列名给子视图,以反映视图间的连接关系。
如果子元素和属性的值对应于数据源中的列名,且需要在解析执行时用检索结果动态替换,则称其为列元素和列属性。列元素可以用xviewsqlcode 属性指定以实际值替换代码值。
  一个使用XTemplate 定义的模板文件涉及的关系如表1所示。

  基于表1,使用XTemplate 定义的一个模板文件如下:
  <?xml version=″1.0″ encoding=″gb2312″?>
  <xtemplate dbms=″odbc″dbparm=″connectstring=′DNS=
  oracle;UID=scott;PWD=tiger′″>
     <员工列表>
         <员工 xviewname=″员工″ xviewsql=″SELECT ENO,ENAME,SAL FROM  WHERE ENO=′E1′ or ENO=′E2′″>
         <编号>ENO</编号>
         <姓名>ENAME</姓名>
         <薪水>SAL</薪水>
          </员工>
     </员工列表>
  </xtemplate>
  使用XTemplate解析程序处理上述模板返回XML文档如下:
  <?xml version=″1.0″ encoding=″gb2312″?>
     <员工列表>
         <员工 员工序号=″1″>
          <编号>E1</编号>
          <姓名>J.Doe</姓名>
          <薪水>4000</薪水>
     </员工>
  <员工 员工序号=″2″>
          <编号>E2</编号>
          <姓名>M.Smith</姓名>
          <薪水>3400</薪水>
  </员工>
  </员工列表>
  使用XTemplate书写的模板文件独立于具体的数据库管理系统,无需数据库管理系统内置的功能模块解析执行,而是由独立于具体数据库管理系统的软件模块解析执行并返回XML查询结果。这样,针对不同数据库管理系统设计的模板在语法上取得了一致。
  XTemplate定义模板文件可以使没有内置XML查询功能的数据库管理系统获得对XML查询的支持。采用XTemplate之后,结构化的数据源需要解释执行的是XTemplate 解析执行软件传递来的SQL语句,这是结构化的数据源通常会提供的标准功能。结构化的数据源返回的数据集仍由XTemplate解析执行软件转换为XML结果文档,并返回给调用者。
3.2 包装器的设计与实现
  XML包装器是整个模型中的重要组成部分,它将异构的数据源按照统一的数据模型进行包装,在客户端对数据的访问都是针对统一的数据模型标准。包装器结构如图2所示。

  XML包装器是一个模板文件解析程序,只要传入不同的模板文件即可生成对应的XML文档。包装器工作过程如下:从传来的模板文件建立DOM对象,取得数据库的连接属性,进而连接数据库;从XTemplate模板文件的xviewsql属性获得SELECT语句,在数据库表或视图中执行此查询语句,建立视图数据集;将数据集中的相关数据代入。关键解析算法如下:
  //predealdom方法建立视图,复制建立的所有元素
  Void predealdom(domobject& root) {
    //视图模板元素指有xviewsql属性的元素
    If (root 不是视图模板元素){
       对root所有子元素递归调用predealdom;
    }
    else {
       视图序号增加;
       为root添加xviewindex属性,值为当前视图序号;
       从xviewsql属性获得视图SELECT语句;
       if (SELECT语句中有参数){
          查找相应祖先视图取得实际值代入;
       }
       根据SELECT 语句建立视图数据集;
       if (不能创建视图数据集){
          errmsg=″xviewsql属性值不是合法的SELECT语句″
          return
       }
       else {
          int RowCount=视图数据集行数;
           //复制当前节点RowCount
          for (int row=1;row<RowCount;row++){
             复制root节点加入DOM;//DOM为模板对象
             添加xviewindex和xviewrow属性;
      }
         对root的所有子元素递归调用predealdom
      }
  }
  //dealdom方法将列元素与列属性替换为实际值
  Void dealdom(domobject& root) {
      If (root 有 xviewindex属性){
         Int index=root元素的xviewindex属性值;
      }
      int row=root元素的xviewrow属性值;
      int AttrNums=root属性数目;
      int ElemNums=root子元素数目;
      for (int i=0;i<AttrNums;i++){
         取得root元素第i个属性a[i];
         if (a[i]是列属性){
         查找编号为xviewindex的视图数据集的row行取得实际值替换;
         }
        }
        for (int j=0;j< ElemNums;j++){
          取得root元素第j个属性e[j];
          if (e[j]是列元素){
        查找编号为index的视图数据集的row行取得实际值替换;
       if (e[i]有xviewcodesql属性{
        根据代码SQL语句取得实际值代替代码值;
         }
        }
  }
  对root的所有子元素递归调用dealdom
  }
  行业标记语言用于校验生成的XML文档是否合法。如果合法,则允许存入XML存储库中;否则应当修改对应的模板文件。
  初始建立XML存储库时,一次性将所有历史数据转换装入XML存储库。之后,有数据更新时触发转换操作,将相应的XML文档加入到XML存储库中。
  对于企业应用来说,访问各种异构数据源是企业内部发展的需要,也是企业信息化建设的要求。本文提出的基于XML异构数据访问中间件解决方案通过预先实现关系数据库到XML数据的转换,加快了访问速度。最后,给出包装器和XML模板的详细设计和说明。
参考文献
1   W3C Recommendation.Extensible Markup Language(XML) 1.0.http://www.w3.org/tr/1998/rec-xml-19980210,1998
2   Shanmugasundaram J.Efficienttly Publushing Relational Data as XML Document.In:Proceedings of the VLDB Conference,Egypt,2000
3   庄冠华.基于XML的数据集成技术的研究与应用.南京大学硕士研究生毕业论文,2004
4   李冠宇,刘军,张俊.分布式异构数据集成系统的研究与实现.计算机应用研究,2004;21(3)

此内容为AET网站原创,未经授权禁止转载。