IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Information Management | WebSphere | XML  >

使用 Federation Server V9.5 新特性 XML Federation 集成远程 pureXML 数据

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

张广舟 (zhanggz@cn.ibm.com), 软件工程师, IBM

2008 年 12 月 10 日

Federation Server V9.5 版本的最突出的新特性之一 XML Federation 的使用方法。如果说 pureXML 是 DB2 UDB LUW V9 中的最大亮点,那么也可以说 XML Federation 是 Federation Server V9.5 中的最大亮点。本文将详细描述 XML Federation 的概念,并进一步介绍怎么利用它方便的定义对远程 UDB 中的 pureXML 数据的映射和进行相关操作。

Federation Server V9.5 版本的最突出的新特性之一 XML Federation 的使用方法。如果说 pureXML 是 DB2 UDB LUW V9 中的最大亮点,那么也可以说 XML Federation 是 Federation Server V9.5 中的最大亮点。 DB2 UDB LUW pureXML 技术的诞生实现了数据库对 XML 数据的原生支持,同时也带来了对 XML 数据集成的需求。 XML Federation 正是因此应运而生。所谓 XML Federation 是指,利用昵称 (Nickname),在 Federation Server 中将远程 DB2 UDB 中的 XML 数据直接映射到本地数据库中,从而使用户可以利用 XQuery 和 SQL/XML 语句对其进行各种操作。本文将详细描述 XML Federation 的概念,和怎么利用它方便的定义对远程 UDB 中的 pureXML 数据的映射和进行相关操作。

什么是 XML Federation?

XML Federation,也可以叫做 Remote XML Data Type Support,是指利用昵称 (Nickname),在 Federation Server 中将远程 DB2 UDB 中的 XML 类型的数据直接映射到本地数据库中,并使用户可以利用与 DB2 一样的 SQL, Xquery 和 SQL/XML 语句,对其进行各种操作。原理如图 1 所示。


图 1. XML Federation 工作原理
图 1. XML Federation 工作原理




回页首


如何定义对远程 pureXML 的映射

如果您有一个 Federation Server V9.5 安装和远程 DB2 LUW 服务器 XML_HOST 。通过以下步骤可以定义对远程 DB2 LUW 的 XML 数据的映射。打开一个 Federation Server 的命令行窗口,然后执行下面的步骤:

1. 打开 Federation 功能:

db2 update dbm cfg using federated yes; 
 db2stop 
 db2start

2. 创建本地的 Federation 数据库:

db2 create db FED_DB using codeset UTF-8 territory US authentication client;

3. Catalog 远程 XML 数据库(在 Windows 上,可以通过 Control Center 实现):

catalog tcpip node XML_NODE remote XML_HOST server xfeduser; 
 catalog database XML_DB as CATALOG_XML_DB at node XML_NODE;

4. 连接到本地数据库:

connect to FED_DB;

5. 创建 DRDA Wrapper,Server 和 User Mapping:

create wrapper drda OPTIONS(db2_fenced 'Y'); 

 create server XML_SERVER type db2/cs version 9.5 wrapper drda authorization 'feduser' 
password 'xxxxxx' options (node 'XML_NODE', dbname 'CATALOG_XML_DB'); 

 create user mapping for feduser server XML_SERVER options ( REMOTE_AUTHID 'feduser', 
REMOTE_PASSWORD 'xxxxxx')

6. 假设远程数据库中已有由如下语句定义的表

create table rem_xml (intcol INT, strcol VARCHAR(128), xmlcol1 XML, 
xmlcol2 XML, xmlcol3 XML)

我们可以对其建立下面的 Nickname

create nickname rem_xml_nick for XML_SERVER.feduser.rem_xml

我们可以通过下列的命令来查看 Nickname 的模式:

describe table rem_xml_nick Data type Column 
 Column name schema Data type name Length Scale Nulls 
 ------------------------------- --------- ------------------- ---------- ----- ------ 
 INTCOL SYSIBM INTEGER 4 0 Yes 
 STRCOL SYSIBM VARCHAR 128 0 Yes 
 XMLCOL1 SYSIBM XML 0 0 Yes 
 XMLCOL2 SYSIBM XML 0 0 Yes 
 XMLCOL3 SYSIBM XML 0 0 Yes

可以看到,远程表的 XML 类型被直接映射成本地的 XML 类型。

当然,也可以对远程的视图建立 Nickname 。

如果我们有 3 个远程服务器,XML_SERVER1, XML_SERVER2, XML_SERVER3, 有相似的表,那么,我们都可以用同样的方法把它们映射过来。

create nickname rem_xml_nick_S1 for XML_SERVER1.feduser.rem_xml 
 create nickname rem_xml_nick_S2 for XML_SERVER2.feduser.rem_xml 
 create nickname rem_xml_nick_S3 for XML_SERVER3.feduser.rem_xml





回页首


对已映射的 XML 数据的操作

将远程的数据映射后,就可以像操作本地的数据一样没有限制的操作了。

1. 查询操作。查询所有远程服务器中的 XML 数据,查出每个站点中符合条件的 XML 文档:

SELECT xmlcol1 FROM rem_xml_nick_S1 WHERE intcol = 1 and strcol = ‘ S ’ ; 
 SELECT xmlcol1 FROM rem_xml_nick_S2 WHERE intcol = 1 and strcol = ‘ S ’ ; 
 SELECT xmlcol1 FROM rem_xml_nick_S3 WHERE intcol = 1 and strcol = ‘ S ’ ; 
…

2. 插入操作。向远程服务器中插入 XML 数据:

INSERT INTO rem_xml_nick_S1 (intcol, strcol, xmlcol1, xmlcol2, xmlcol3) 
VALUES(1, 'S', '<a> <b>xml col1 </b><c> </c> </a>',
'<a> <b> xml col2 </b> <c> </c> </a>',
'<a><b> xml col3</b><c> </c> </a>');

可以将一个服务器的 XML 数据导入另一个:

INSERT INTO rem_xml_nick_S2 SELECT * FROM rem_xml_nick_S1

3 .更新操作。将某些 XML 文档更新。

UPDATE rem_xml_nick_S1 SET xmlcol1 = xmlparse(document ‘ <a> new data <b> </b></a> ’ ) 
WHERE intcol = 1 and strcol = ‘ S ’ ;

4 .删除操作。将某些文档删除。

DELETE FROM xmlmul_nick WHERE xmlexists( ‘ $x/a ’ passing xmlcol1 as “ x ” );

5. SQL/XML 查询。可以使用诸如 XMLPARSE, XMLVALIDATE, XMLSERIALIZE, XMLQUERY 等 SQL/XML 函数 :

SELECT xmlquery('$x/a/c' passing xmlcol1 as "x") from rem_xml_nick_S1 
where xmlexists('$x/a/b[value= ‘ XXX ’ ]' passing xmlcol1 as "x");

我们还可以将每个 Nickname 的查询结果用 Union 操作生成统一的结果:

SELECT xmlquery('$x/a/c' passing xmlcol1 as "x") FROM rem_xml_nick_S1 
WHERE xmlexists('$x/a/b[value= ‘ YYYY ’ ]' passing xmlcol1 as "x") UNION ALL 

 SELECT xmlquery('$x/a/c' passing xmlcol1 as "x") FROM rem_xml_nick_S2 
WHERE xmlexists('$x/a/b[value= ‘ YYYY ’ ]' passing xmlcol1 as "x") UNION ALL 

 SELECT xmlquery('$x/a/c' passing xmlcol1 as "x") FROM rem_xml_nick_S3 
WHERE xmlexists('$x/a/b[value= ‘ YYYY ’ ]' passing xmlcol1 as "x")

6 . XQuery 查询。

for $proj in db2-fn:sqlquery('SELECT xmlcol1 FROM rem_xml_nick_S1 ')/Projects/Project 
 for $emp in db2-fn:sqlquery('SELECT xmlcol2 FROM rem_xml_nick_S3')//Employee 
 where $proj/@owner = $emp/@id 
 order by $proj/@id 
 return ($proj/Name, $emp/Name);

这里我们把服务器 1 的数据和服务器 3 的数据在 XQuery 中“连接”起来。





回页首


在非 Unicode 环境中集成 XML 数据时对 Codepage 的处理方式

Federation Server V9.5 支持非 Unicode 的 pureXML 数据源。在非 Unicode 环境中,从远程传递 XML 数据到本地,或从本地到远程,可能需要对 Codepage 进行转换。从远程获取的 XML 文档,Federation 将调用 XML Parser,将其转换成内部的表示形式,此时同时会将 Codepage 转换为 Unicode 。假设远程的数据库的 Codepage 与 Federation 的不同 :

以 Character 方式传递的 XML 文档将被转换为 Federation 的 Codepage 。当文档有 Internal Encoding(位于 XML Header 类似于 "<?xml version="1.0" encoding = "...encoding string">" 的字符串中)时,Federation 会将其直接清除。在随后将文档传给 XML Parser 处理时,如果不是 Unicode,将被转换为 Unicode 。

以 Binary 方式传递的 XML 文档,Codepage 转换只发生在将其传给 XML Parser 时。如果文档有 Internal Encoding, 且不是有效的 IBM Encoding 模式,Federation 会设法将它映射成有效的 IBM Encoding,如果不成功,就直接将其清除。

在缺省模式下,Federation 会以 Character 方式与远程数据库传递 XML 文档。需要注意的是,Codepage 的转换会占用额外的 CPU 周期,会使数据处理的性能下降,应尽量避免。





回页首


对 XML 数据的验证

从远程接收来的 XML,可以调用 XMLVALIDATE 进行验证。此时如果直接调用 XMLVALIDATE, 验证用的 Schema 将由 XML 文档中的schemaLocation属性确定。而由于 XML 文档是从远程服务器获取的,所以这个 schemaLocation 可能在本地并不有效。这时需要在本地定义相应的 Schema,并在调用 XMLVALIDATE 时指定注册的 Schema 或本地可访问的 URI 用于验证,以便覆盖对 schemaLocation 的使用。定义和注册 schema 的步骤可以参见文献 3





回页首


集成 XML 文件

前面说明了怎样集成远程 DB2 LUW 数据库中 XML 数据。对于非关系型数据源,如 XML 文件,可以用下面的方式定义 Nickname:

CREATE NICKNAME customers 
 ( 
	 doc VARCHAR(100) OPTIONS(DOCUMENT 'FILE'), 
                       customer_info XML 
 ) FOR SERVER xml_server

这样就可以用下面的方式对 XML 文件进行查询了:

SELECT xmlquery('$x/name ’ passing customer_info as "x") from customers 
WHERE doc = ‘ /home/customer.xml ’

集成非关系数据源 XML 数据的具体的使用方法可以参见参考资源。





回页首


使用 XML Federation 时的限制

FederationV9.5 中,使用 XML Federation 功能时的限制包括,不能对 Nickname 中 XML 类型的 Column 进行 Alter 操作改变其本地的类型;不能对其定义 Federation Index ;不能定义以 XML 类型的 Column 为参数 Stored Procedure 或 Federated Stored Procedures 等。





回页首


小结

通过本文,读者将理解怎么样通过 Federation Server V9.5 集成远程 DB2 的 pureXML 数据,在充分利用 Federation Server 实时性,高效性和灵活性优势的基础上,方便的构建分布式的 XML 数据库应用。



参考资料

学习

获得产品和技术

讨论


关于作者

张广舟,IBM CSDL 软件工程师,2006 年 7 月加入 WebSphere Federated Server 产品团队。从事过产品代码的测试工作。现在是一名 SQL 编译器开发人员。




对本文的评价








IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款