|
分布式工作单元和联邦数据库环境
什么是分布式工作单元?
远程工作单元 (remote unit of work,RUOW)允许用户或程序为工作单元更新或读取在远程位置上的数据。在一个工作单元里只能访问一个数据库。RUOW 的特点是:
- 每个工作单元支持多个请求(SQL 语句)。
- 每个工作单元支持多个游标。
- 每个工作单元只能访问一个数据库。
- 应用程序要么提交工作单元,要么回滚工作单元。在某些错误情况下,数据库服务器可能回滚工作单元。
分布式工作单元 (distributed unit of work,DUOW)也称为多站点更新(multi-site update),它在一个工作单元里使用多个数据库。DUOW 的特点是:
- 每个工作单元更新多个数据库。
- 应用程序控制工作的分布,并发起提交。
- 每个工作单元可能有多个请求。
- 在多个数据库服务器之间协调提交。
如何使用 DUOW?
分布式工作单元在查询和应用程序中提供了许多可能性。首先,可以查询多个数据库,而不限于一个数据库。实际上,不只可以访问 DB2 数据库。通过 Websphere Federated Server 使用联邦环境,可以用单一查询同时访问和更新 DB2、Informix 和 Oracle 表。
联邦环境包含对一个或多个远程数据源及其特征的引用。“昵称(nickname)” 是数据对象在联邦系统中的本地别名。这个昵称用来引用特定数据源中的对象。
我们来看一个示例,它将在 Websphere Federated Server 中创建和使用一个昵称。首先,需要创建一个称为 FARAWAYTABLE 的昵称,它引用的对象驻留在称为 ORA 的 Oracle 数据源中。这个数据源包含对象 USER1.DATATABLE1。一旦创建了昵称,就可以将它作为常规的(本地)数据库表来对待。应该注意,在执行下面代码清单中的 CREATE NICKNAME 语句之前,必须执行许多其他语句(这里未显示)来设置联邦环境;这些语句定义联邦环境中数据源的名称和位置、安全设置和其他配置参数。
CREATE NICKNAME farAwayTable FOR ora.user1.datatable1
SELECT * FROM ora.user1.datatable1
{this will fail since you have to refer to the table by its nickname}
SELECT * FROM farAwayTable
{this will return the results from the table}
SELECT *
FROM farawaytable, dept
WHERE dept.id = farawayTable.id
{this joins the two tables together and returns the result set}
INSERT INTO farawayTable
VALUES (SELECT * from dept)
{this inserts all the data from the dept table into the farAwayTable}
|
查询不必知道它所引用的对象是本地数据库的一部分,还是完全属于另一个数据服务器。即使移动了底层对象,也不必修改应用程序。这称作位置透明性(location transparency)。
图 4 说明了用于联邦的潜在的源和目标。 图 4. 联邦数据源
联邦还可以用于访问非关系型的数据源,例如文本或 XML 文件。为此,必须创建一个 “包装器(wrapper)”,用来说明如何在其中的数据源上执行 SELECT、UPDATE、DELETE 和 INSERT 语句。一旦创建了包装器,就可以将该数据源当作本地表来对待。科学社区已发现该技术对于处理平面文件中的 DNA 信息极其有用。
使用 DUOW
使用 DUOW 有许多优点:
- 可以轻松地访问多个数据源。
- 极大地减小了应用程序复杂性。
- 向应用程序提供对多个 RDBMS 的读/写能力。
同时也有一些缺点:
- 需要维护多个数据库。
- 由于要与多个系统进行交互,所以错误处理更加复杂。
- 远程系统可能挂起,导致 SQL 要花很长时间来响应。
- 大量数据的网络传输时间可能减慢查询的速度。
- 由于延迟而引起的远程和本地系统的锁定并发性问题可能导致问题。
DUOW 和联邦常常用于金融和制药领域,从而在一个简单的程序中协调多个数据源。通过使用 DUOW,可以编写一个 SQL 语句来返回并聚合来自多个源的数据。此外,如果修改了底层的数据源,就只需更改其昵称,而不必修改整个数据访问应用程序。
以下是一些适合使用 DUOW 的特定领域:
- 组合来自多个数据库的报表。
- 组合来自多个 RDBMS 的数据。
- 将数据从一个 RDBMS 移动到另一个 RDBMS。
- 在 SQL 语句中使用非关系型的数据源。
|