如何通过Oracle数据库更改通知获取表的主键

时间:2016-03-16 22:26:10

标签: java oracle

我可以从Oracle数据库收到通知,感谢to this code并省略了这一行:

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 thatdespite the rowid being imutable,如果删除行并插入新行,则可以重新分配相同的rowid,如果行在分区表中,则rowid可以更改。因此,可以做的最好的事情是使用rowid和行的主键。 我的表具有使用this code创建的可自动增量的主键(带序列和触发器)。

我无法控制数据库上发生的事情,或者有人多次插入和删除行。因此,当使用通知给出的rowid选择它时,我可以得到错误的行。

有没有办法可以通过Oracle数据库更改通知获取行的主键,这样我就能正确识别插入/删除/修改的行?

我正在使用Oracle数据库XE 11.2 Express和Java 8.用于数据库连接的用户已具有change notification权限。

1 个答案:

答案 0 :(得分:0)

似乎你有很多开销试图基本上维护GUI中数据的新快照。查看客户端结果缓存并且每X秒重新运行查询可能更简单;让Oracle看到数据是否发生了变化。您将被限制为支持OCI的JDBC驱动程序。有关详细信息,请参阅http://docs.oracle.com/cd/E11882_01/server.112/e41573/memory.htm#PFGRF985。使用客户端结果缓存,第一次执行SQL时,将花费500毫秒。使用相同标准的下一个查询将花费2或3毫秒。假设结果集很小(少于100行非常小),如果没有你想要构建的所有框架,你可以获得更好的结果。