【问题标题】:How Can I get table's primary key via Oracle Database Change Notification如何通过 Oracle 数据库更改通知获取表的主键
【发布时间】: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的情况:如果表设置了“启用行移动”;这不太可能,但可能。

标签: java oracle


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多