JDBC 介体异常
JDBC 介体异常是数据库报告的表面错误,或者指示在尝试实例化 DMS 时使用无效的元数据。

Mediator 异常是所有数据介体服务的根本异常,特别的是,JDBCMediator 异常是 JDBC DMS 的根本异常。
当数据库报告错误时,发生 DB 异常。以下几种情况下都会发生此异常:
- 当被使用的连接已将 AutoCommit 属性设置为 true,但是 JDBC DMS 正在控制事务并且需要将它设置为 false 时
- 当尝试使用不受支持的数据库时
- 当提交或回滚期间发生其他后端数据库错误时。
当执行 applyChanges() 导致数据冲突时会发生乐观并发控制 (OCC) 异常。当发生该异常时,该异常包含最初的行值、当前的行值和尝试的行值。这些值用于帮助从错误中恢复。
当为创建的 JDBC DMS 提供了无效的元数据,会发生 InvalidMetadata 异常。当查询需要未在元数据中定义的表或列,或者 Oracle、Informix® 以及受支持的较低版本 Sybase 数据库中不同表的列名称相同时,会发生此异常。
示例:强制 OCC 数据冲突和 JDBC 介体异常。以下示例强制产生一个冲突以演示检测并显示因此而发生的异常。
// This example assumes that a mediator has already
// been created and the first name in the list is Sam.
// It also assumes that the Customer table has an OCC
// column and the metadata has set this column to be
// the collision column.
DataObject graph1 = mediator.getGraph();
DataObject graph2 = mediator.getGraph();
DataObject customer1 = (DataObject)graph1.getList("CUSTOMER").get(0);
customer1.set("CUSTFIRSTNAME", "Bubba");
DataObject customer2 = (DataObject)graph2.getList("CUSTOMER").get(0);
customer2.set("BOWLERFIRSTNAME", "Slim");
mediator.applyChanges(graph2);
try
{
mediator.applyChanges(graph1);
}
catch (OCCException e)
{
// Since graph1 was obtained before graph2 and
// graph2 has already been submitted, trying to
// apply the same changes to graph1 causes
// this OCC Exception.
assertEquals("Sam", e.getOriginalDO(). getString("CUSTFIRSTNAME"));
assertEquals("Bubba", e.getChangedDO(). getString("CUSTFIRSTNAME"));
assertEquals("Slim", e.getDatabaseDO(). getString("CUSTFIRSTNAME"));
}