我可以从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 that,despite the rowid being imutable,如果删除行并插入新行,则可以重新分配相同的rowid,如果行在分区表中,则rowid可以更改。因此,可以做的最好的事情是使用rowid和行的主键。 我的表具有使用this code创建的可自动增量的主键(带序列和触发器)。
我无法控制数据库上发生的事情,或者有人多次插入和删除行。因此,当使用通知给出的rowid选择它时,我可以得到错误的行。
有没有办法可以通过Oracle数据库更改通知获取行的主键,这样我就能正确识别插入/删除/修改的行?
我正在使用Oracle数据库XE 11.2 Express和Java 8.用于数据库连接的用户已具有change notification
权限。
答案 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行非常小),如果没有你想要构建的所有框架,你可以获得更好的结果。