【发布时间】:2016-03-16 22:26:10
【问题描述】:
感谢to this code,我可以从 Oracle 数据库中获取通知并省略此行:
prop.setProperty(OracleConnection.DCN_QUERY_CHANGE_NOTIFICATION,"true");
我还可以解决我的 ORA-29977 问题,将 select * from act_code_metadata where product_id=1159 更改为 select column_with_Number_type from act_code_metadata where product_id=1159
一切都按预期进行:D
这是我用来打印行信息的代码(Java 8):
DatabaseChangeRegistration dcp.addListener((DatabaseChangeEvent dce) ->
System.out.println(
"Changed row id : " +
dce.getTableChangeDescription()[0].getRowChangeDescription()[0].getRowid().stringValue()
+ " " + dce.getTableChangeDescription()[0].getRowChangeDescription()[0].getRowOperation().toString()));
但我得到的所有信息都是行的物理地址 (rowid) 和所涉及的操作(插入、删除或更新)。 我需要识别正在修改/插入/删除的行,以在我的 GUI 的几个 Swing 控件中刷新我的缓存数据。
I've read that,despite the rowid being imutable,如果删除行并插入新行,则可以重新分配相同的rowid,如果该行在分区表中,则可以更改rowid。因此,最好的办法是使用 rowid 和行的主键。 我的表有一个使用this code 创建的自动增量主键(带有序列和触发器)。
我无法控制数据库上发生的事情,或者是否有人多次插入和删除行。因此,当使用通知给出的 rowid 选择它时,我可能会得到错误的行。
有没有办法通过 Oracle 数据库更改通知获取行的主键,以便正确识别插入/删除/修改的行?
我正在使用 Oracle Database XE 11.2 Express 和 Java 8。用于数据库连接的用户已经拥有 change notification 权限。
【问题讨论】:
-
另一种无法信任rowid的情况:如果表设置了“启用行移动”;这不太可能,但可能。