级别: 初级 张广舟 (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 工作原理
如何定义对远程 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. 连接到本地数据库:
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 编译器开发人员。 |
对本文的评价
|