随着信息化建设的不断深入,不少企业与组织建立了各种应用系统。由于这些系统是在不同阶段开发的,每个系统都有自己的运行环境和数据存储方式,这些数据的格式不统一,各个应用系统彼此封闭,数据难以交换和共享。利用中间件(Middleware)技术集成各种异构数据时,不用改变原始数据的存储和管理方式,可集中为异构数据源提供一个统一的高层检索服务,是实现异构数据集成的理想解决方案。
异构数据访问中间件系统的核心就是要解决异构数据源的分布性、自制性和异构性。随着分布式计算技术(如CORBA、XML等)的迅猛发展,使得原来的系统可以通过它们进行封装,隐藏内部结构,采用公共数据模型将局部共享数据进行封装,对外提供公共访问接口。异构数据系统是相关的多个数据库系统的集合,可以实现数据的共享和透明访问,每个数据库系统在加入异构数据库系统之前本身就已经存在,拥有自己的DBMS。异构数据库的各个组成部分具有自身的自治性,实现数据共享的同时,每个数据库系统仍保有自己的应用特性、完整性控制和安全性控制。
1 XML全局数据模式
异构数据访问中间件必须提供一种全局数据模式来统一异构源数据模式。异构数据集成的全局模式必须满足:①能够描述各种数据格式,无论其为结构化还是半结构化,无论它是支持所有的查询语言还是简单的文本查询;②易于发布和进行数据交换,集成后的数据可以方便地以多种格式发布和便于应用交换数据。
早期异构数据的集成系统通常采用关系或对象的数据模式作为全局模式。然而,它们并不能满足网络时代的Intranet/Internet应用所提出的高标准。随着可扩展标记语言XML及其相关技术的发展,XML不仅成为了应用间交换数据的一种标准,也是万维网重要的信息交换标准和表示技术之一。XML(Extensible Markup Language)即可扩展标记语言,它与HTML一样,都是SGML(Standard Generalized Markup Language,标准通用标记语言)。Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。
XML是一种具有很强的数据描述能力的标记语言,它第一次提供了一种信息交换模式,此格式是可编辑、易理解并且可表示任何类型的结构化或半结构化的信息。XML 提供了丰富的数据构造和解析方法,能够适应多样并且不断变化的网络应用环境,被广泛用于异构系统间的数据交换和互操作应用中。XML与Access,Oracle和SQL Server等数据库不同,数据库提供了更强有力的数据存储和分析能力,例如:数据索引、排序、查找、相关一致性等,XML仅仅是展示数据。事实上XML与其他数据表现形式最大的不同是:它极其简单。这是一个看上去有点琐细的优点,但正是这点使XML与众不同。
2 系统框架
中间件是一种支持分布式应用的重要组件,它是一种独立的系统软件和服务程序。分布式应用借助中间件在不同的技术间共享资源,为应用提供统一的编程模型,处理异构、分布问题和管理计算资源及网络通信。
大多数基于 XML 的数据集成系统框架采用Mediator/Wrapper架构,该架构的缺点是查询效率不高。这是由于底层数据源的数据结构、数据模式、存储方法、查询能力差别很大。数据访问中间件的设计是非常复杂的,包装器同时要兼顾数据转换、数据清洗等任务,并且这还仅是在查询时触发的处理。
基于XML的异构数据访问中间件模型XHDAM的系统结构如图1所示。XHDAM从分布式对象操作和异构数据集成二个方面解决系统互操作问题。首先,XHDAM基于CORBA技术,CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构,通用对象请求代理体系结构)是由OMG组织制订的一种标准的面向对象应用程 序体系规范。或者说 CORBA体系结构是对象管理组织(OMG)为解决分布式处理环境(DCE)中,硬件和软件系统的互连而提出的一种解决方案;OMG组织是一个国际性的非盈利组织,其职责是为应用开发提供一个公共框架,制订工业指南和对象管理规范,加快对象技术的发展。CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构,通用对象请求代理体系结构)是由OMG组织制订的一种标准的面向对象应用程 序体系规范。或者说 CORBA体系结构是对象管理组织(OMG)为解决分布式处理环境(DCE)中,硬件和软件系统的互连而提出的一种解决方案;OMG组织是一个国际性的非盈利组织,其职责是为应用开发提供一个公共框架,制订工业指南和对象管理规范,加快对象技术的发展。通过CORBA提供的ORB(Object Request Broker)实现分布计算环境中对象操作支持,使不同的应用系统能够方便地与XHDAM交互,达到不同应用系统之间交互的目的,从而实现系统的透明性。
(1)客户端:向CORBA服务器发出访问请求。客户端只提供统一的访问界面,不处理业务逻辑关系和集成管理任务。
(2)CORBA公共服务:提供CORBA的标准服务,包括名字服务、事件服务、安全服务等。
(3)查询处理器:当客户请求时,分解全局查询到局部查询;当查询结束时,负责将局部查询结果汇总返回给客户端。另外还负责局部查询的优化,提高查询效率。
(4)目录服务:是XML存储库的一个摘要,包含XML存储库的静态和动态信息。XML数据目录服务可以自动、智能地建立目录服务,并对信息自动搜索、自动分类、自动传输。
(5)事务服务:负责全局模式和局部模式之间的集成与分解关系,如全局事务到局部子事务的处理,全局查询到局部子查询的处理。
(6)包装器:是一种目的语言资料类型的物件,可包装语言的物件。当在 JavaScript 中设计程式的时候,你可以使用包装器物件存取 Java 物件的方法和栏位;呼叫或存取包装器里的方法或属性,用以在 Java 物件上产生呼叫。对 Java 而言,JavaScript 物件是被包装在类别为JSObject 的实体之中,并传送给 Java。当 JavaScript 物件传送给 Java 的时候,执行时期引撉会建立类型为 JSObject 的 Java 包装器;当 JSObject 从 Java 传送到 JavaScript 的时候,执行时期引撉会解开包装,还原为原本的 JavaScript 物件类型。JSObject 类别提供了可呼叫 JavaScript 方法和检查 JavaScript 属性的介面。负责解决异构数据源的包装问题,将分散在各处的数据源按照XML模板进行包装。开始,包装器一次性将数据源中的所有数据转换到存储库中。当有新数据源追加到源数据库时,就通过触发器触发包装程序将源数据库中的新数据包装成XML数据加入存储库。客户端对数据的访问是通过查询处理器访问XML存储库实现的。
3 XML模板和包装器的设计与实现
为了提供对XML 的支持,各大数据库厂商纷纷对各自的数据库产品进行了扩展,提供了基于模板的查询。但各数据库管理系统支持的查询模板语法差异很大,不能互用。因此,访问多个异构数据源时需要为不同类型的数据库提供多个符合其相应语法的模板文件,这就增加了项目开发的复杂度。
3.1 XTemplate模板设计
XTemplate是一个适用于PHP的模板引擎。它允许把HTML代码与PHP代码分开存储。XTemplate包含了许多有用的功能。比如:嵌套的程序块,各种类型的插值变量。其代码非常简洁并且是优化的。Xtemplate是sugarCRM使用的模版技术,使用起来相对简单。XTemplate使用了多种标签和特殊操作符支持模板,使得模板在应付复杂的数据结构时尤为健壮。这里所列出概括的几项功能,欲了解完整的细节和使用方法,请参阅XTemplate API文档。自动数组填充和作用域切换,可在子模板作用域内访问父级对象,可访问数组索引,支持数据值的简单匹配,自动渲染浮点型数组(不包含非对象的值),可执行模板中直接写好的任意语句,支持模板的配置属性,可通过配置项对象自定义模板方法,可用于服务端的JavaScript模板。
为了访问不同的数据源,需要在模板文件中定义数据源的连接属性。其中:数据库连接属性包括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 ′ [element] ′′
使用XTemplate定义的模板文件是格式正确(Well-formed)的XML文档,且具有根元素,可用来提供数据源连接参数servername、dbms、dbparm、database、logid、logpass、autocommit。
具有xviewname属性和xviewsql属性的子元素称为视图模板元素,因为其提供了表征数据集的名称和SQL语句的二个属性。xviewname属性提供视图名称,xviewsql属性提供视图SELECT语句。SELECT语句中可以用:p_xviewname:p_columnname的形式传递父视图的列名给子视图,以反映视图间的连接关系。
如果子元素和属性的值对应于数据源中的列名,且需要在解析执行时用检索结果动态替换,则称其为列元素和列属性。列元素可以用xviewsqlcode 属性指定以实际值替换代码值。
一个使用XTemplate 定义的模板文件涉及的关系如表1所示。
基于表1,使用XTemplate 定义的一个模板文件如下:
oracle;UID=scott;PWD=tiger′″>
<员工列表>
<员工 xviewname=″员工″ xviewsql=″SELECT ENO,ENAME,SAL FROM WHERE ENO=′E1′ or ENO=′E2′″>
<编号>ENO
<姓名>ENAME
<薪水>SAL
使用XTemplate解析程序处理上述模板返回XML文档如下:
<员工列表>
<员工 员工序号=″1″>
<编号>E1
<姓名>J.Doe
<薪水>4000
<员工 员工序号=″2″>
<编号>E2
<姓名>M.Smith
<薪水>3400
使用XTemplate书写的模板文件独立于具体的数据库管理系统,无需数据库管理系统内置的功能模块解析执行,而是由独立于具体数据库管理系统的软件模块解析执行并返回XML查询结果。
XTemplate定义模板文件可以使没有内置XML查询功能的数据库管理系统获得对XML查询的支持。采用XTemplate之后,结构化的数据源需要解释执行的是XTemplate 解析执行软件传递来的SQL语句,这是结构化的数据源通常会提供的标准功能。
3.2 包装器的设计与实现
XML包装器是整个模型中的重要组成部分,它将异构的数据源按照统一的数据模型进行包装,在客户端对数据的访问都是针对统一的数据模型标准。包装器结构如图2所示。
XML包装器是一个模板文件解析程序,只要传入不同的模板文件即可生成对应的XML文档。包装器工作过程如下:从传来的模板文件建立DOM对象,取得数据库的连接属性,进而连接数据库;从XTemplate模板文件的xviewsql属性获得SELECT语句,在数据库表或视图中执行此查询语句,建立视图数据集;将数据集中的相关数据代入。XML即可扩展标记语言,它与HTML一样,都是SGML(Standard Generalized Markup Language,标准通用标记语言)。Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。关键解析算法如下:
//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
复制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
取得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模板的详细设计和说明。
-
数据
+关注
关注
8文章
6876浏览量
88803 -
存储
+关注
关注
13文章
4260浏览量
85653 -
HTML
+关注
关注
0文章
277浏览量
34324
发布评论请先 登录
相关推荐
评论