0

我想使用我的 java 应用程序跟踪 oracle11g 中表的所有更改。

我正在考虑使用ora_rowscn这样的:执行选择并每次获取更新的记录:

max = 0;

While(true){

   ps = con.prepare statement("Select rowscn, * from t where  ora_rowscn > ?");

   ps.setInt(max);

   max = calcMaxRowScn(ps.getResultSet());

}

calcMaxRowScn- 从结果集中返回最大 rowscn。

Oracle 文档状态:

"ORA_ROWSCN returns the conservative upper bound system change number (SCN) of the most recent change to the row"

所以:

  1. 使用 rowscn 字段安全吗?
  2. 我可能会错过一些更新吗?
4

1 回答 1

1

你不应该错过任何更新(你显然会错过任何删除)。ORA_ROWSCN即使实际上没有进行任何更改,您也可能会看到for a row change,尤其是在未ROWDEPENDENCIES启用启用的情况下构建表时,因为默认情况下 SCN 存储在块级别而不是行级别。只要您的应用程序可以处理未更改的处理行,那应该没问题。当然,由于ORA_ROWSCN没有被索引,因此每次通过 Java 的循环都会对表进行全面扫描——这很容易最终变得相当慢并且给数据库服务器带来相当大的负载。

根据您要完成的任务,可能会有更简单的选择。例如,您可能想要使用连续查询通知之类的东西,而不是自己滚动。

于 2013-11-06T21:54:25.900 回答