我想使用我的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"
所以:
答案 0 :(得分:1)
你不应该错过任何更新(你显然会错过任何删除)。即使实际上没有进行任何更改,您可能会看到ORA_ROWSCN
行更改,特别是当表未使用ROWDEPENDENCIES
构建时,因为默认情况下SCN存储在块级而不是行水平。只要您的应用程序可以处理未更改的处理行,那应该没问题。当然,由于ORA_ROWSCN
没有编入索引,因此每次通过Java循环都会完全扫描表 - 这很容易变得非常缓慢,并且会给数据库服务器带来相当大的负载。
根据您要完成的任务,可能会有一个更简单的选择。例如,您可能希望使用类似Continuous Query Notification的内容而不是自己滚动。