技术开发 频道

服务数据对象简介

  DMS 应该使用 SDO 的强大特性更新后端数据源,具体地说,就是要使用其变更摘要。使用数据图的变更摘要有许多不同的方法。该例中,我们将考察变更摘要树中引用的所有数据对象,并从中获得新的数据对象。

  清单 4. DMS 根据数据图更新后端数据源

1 /**
2 * Update the DMS's backend data to reflect changes
3 * in the data graph.
4 * Since this DMS has no actual backend data and therefore
5 * has nothing to update, we will just navigate
6 * the change summary and report (print) what's changed.
7 */
8 public void update(DataGraph dataGraph)
9 {
10   ChangeSummary changeSummary = dataGraph.getChangeSummary();
11
12   // Call endLogging to summarize changes.
13   // The DMS should call beginLogging() and endLogging(),
14   // not the client.
15   changeSummary.endLogging();
16
17   // Use SDO ChangeSummary's getChangedDataObjects() method.
18   List changes = changeSummary.getChangedDataObjects();
19   for (Iterator iter = changes.iterator(); iter.hasNext();)
20   {
21     DataObject changedObject = (DataObject)iter.next();
22     System.out.print("DMS updating " +
23       changedObject.getString("name"));
24     for (Iterator settingIter = changeSummary.getOldValues(
25       changedObject).iterator(); settingIter.hasNext();)
26     {
27       ChangeSummary.Setting changeSetting =
28         (ChangeSummary.Setting)settingIter.next();
29       Property changedProperty = changeSetting.getProperty();
30       Object oldValue = changeSetting.getValue();
31       Object newValue = changedObject.get(changedProperty);
32       System.out.print(" (changed: " + changedProperty.getName() +
33         " from \"" + oldValue + "\" to \"" + newValue + "\")");
34       // If not a simple example, we could update the backend here.
35     }
36     System.out.println();
37   }
38 }
39

  该例中根本没有后端更新。但在实际应用时,后端更新应该在这个方法中完成。

  DMS 首先要对数据图的更新摘要调用 endLogging() ,从客户机取回数据图,以便进行后端更新。这样将关闭变更记录,从而提供自 beginLogging() 调用以来(通常在创建之后调用)对数据图所做修改的摘要。这种格式支持 DMS 高效、递增地更新后端数据源。变更摘要中的修改分为三种类型:

  对象变更包含数据图中属性已经被修改的那些数据对象的引用、被修改的属性和修改之前的属性值。DMS 可以使用原来的属性值确保后端数据在此期间没有被别的人修改。

  对象创建包含添加到数据图中的数据对象。将这些对象表示了需要添加到后端数据结构中的新数据。

  对象删除包含从数据图中删除的数据对象。这些对象表示了需要从后端数据结构中删除的数据。

  注意,我们使用标准的 SDO API 检查数据图的变化,虽然也可以使用 EMF ChangeDescription API(而不是 SDO 的 ChangeSummary)。该例中仅仅更新简单的属性值,对性能的影响不是很明显。但在其他情况下,比方说要更新大量的属性,使用 EMF API 可以显著地提高性能。比如,假设要从数百个雇员的列表中删除一个雇员。在这种情况下,ChangeSummary 只能提供对原有数百个雇员列表中的原有值的访问。 而 EMF 的 ChangeDescription 接口还可以提供更具体的信息,如“删除某个索引位置的雇员”,这就有用得多。

  还要注意的是,该变更摘要中只修改了一个对象,没有删除或者添加对象。如果使用 SDO 实现从数据图中删除对象,还要注意类型为 objectsToAttach 的元素。该名称实际上是对象删除的 EMF ChangeDescription 名。这些元素是那些已经删除但是在回滚时需要放回图中的数据对象,这就是变更的 EMF 视图。总而言之, objectsToAttach == deleted objects(删除的对象) 。

  调试应用程序

  如果在示例应用程序中将 debug 变量设为 true ,那么就可以执行以下调用,查看数据图的序列化版本。

  ((EDataGraph) dataGraph).getDataGraphResource().save(System.out, null);

  还可以使用 Eclipse 调试环境。比如,我们建议在 SDOClient.java 第 100 行设置一个断点,并调试 SDOClient (像在 Java 应用程序中那样)。然后,在调试窗口中就可以看到内存中的数据图(在 Variables 下)和它的数据对象(Boss、Terrence Shorter 等),如图 4 所示。

  图 4. 在调试模式下观察数据对象

  还可以用这种方法查看变更摘要,如图 5 所示。

  图 5. 在调试模式下观察变更摘要

  上面的截屏图看起来很复杂,现在看来用处也不大,但是当您调试自己的 SDO 应用程序并查看数据对象和变更摘要的内容时,就会用到它。

  结束语

  本文简要描述了 SDO 及其功能。我们通过一个示例应用程序说明了 SDO 的一些功能。更多参考信息,请参阅 Eclipse 帮助系统下的 SDO API 文档。该规范仍在发展和改进之中。比如,SDO 1.0 强调了 SDO 的客户机方面,而没有指定一个 DMS API。SDO 目前正通过 JCP 实现标准化,请关注有关的进展情况。因为 SDO 非常灵活,设计 SDO 应用程序时需要做很多决策。这些决策将影响程序的重用性和性能。因此,在编码之前,应该认真考虑应用模式和应用程序数据的特征。

  代码下载:j-sdoSample.zip

0