Oracle 12c中的数据库更改通知

我在我的maven项目中使用ojdbc8 12.2.0.1,我想通知表中是否有新条目。 我使用的是ojdbc7 11.2.0.1和oracle 11g,在此方面,它工作正常。 现在,我要升级到使用ojdbc8 12.2.0.1 jar的oracle 12c。

如我所见,该表正在进入user_change_notification_regs表,但是一旦已注册表中有新条目,则已注册表将被取消注册。 这意味着user_change_notification_regs表中没有条目。

代码未提供任何类型的异常或错误。

任何替代DCN的方法也有帮助。

代码:

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import oracle.jdbc.OracleConnection;
import oracle.jdbc.OracleDriver;
import oracle.jdbc.OracleStatement;
import oracle.jdbc.dcn.DatabaseChangeEvent;
import oracle.jdbc.dcn.Databasechangelistener;
import oracle.jdbc.dcn.DatabaseChangeRegistration;

public class DBChangeNotification {
    public static void main(String[] argv) {
        try {
            Connection con = DriverManager.getconnection(url,user,password);
            startDcn(con);
        } catch (SQLException mainSQLException) {
            mainSQLException.printStackTrace();
        }
    }

    public static void startDcn(Connection conn) throws SQLException {
        Properties prop = new Properties();
        prop.setProperty(OracleConnection.DCN_NOTIFY_ROWIDS,"true");
        prop.setProperty(OracleConnection.DCN_IGNORE_DELETEOP,"true");
        prop.setProperty(OracleConnection.DCN_IGNORE_UPDATEOP,"true");

        DatabaseChangeRegistration dcr = conn.registerDatabaseChangeNotification(prop);
        //listener not getting called as table getting unregistered.
        dcr.addListener(new Databasechangelistener() {
            public void onDatabaseChangeNotification(DatabaseChangeEvent dce) {
                RowChangeDescription[] rowChangeDescription = dce.getTableChangeDescription()[0].getRowChangeDescription();
                for (RowChangeDescription rcd: rowChangeDescription) {
                    System.out.print("Working"); //not getting print
                }
            }
        });

        Statement stmt = conn.createStatement();
        ((OracleStatement) stmt).setDatabaseChangeRegistration(dcr);
        ResultSet rs = stmt.executeQuery("select * from demo where rownum='1' ");
        while (rs.next()) {}
        String[] tableNames = dcr.getTables();
        for (int i = 0; i < tableNames.length; i++)
            System.out.println(tableNames[i] + " is part of the registration.");
        rs.close();
        stmt.close();
    }
    catch (SQLException ex) {
        ex.printStackTrace();
    }
}

注意:请忽略语法错误(如果有)。

lxg1201 回答:Oracle 12c中的数据库更改通知

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2789966.html

大家都在问