使用ora_rowscn了解每个更改

时间:2013-11-06 21:41:54

标签: java sql oracle oracle11g

我想使用我的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 docs状态:

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

所以:

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

1 个答案:

答案 0 :(得分:1)

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

根据您要完成的任务,可能会有一个更简单的选择。例如,您可能希望使用类似Continuous Query Notification的内容而不是自己滚动。