Уведомление об изменении базы данных в oracle 12c - PullRequest
0 голосов
/ 10 января 2020

Я использую ojdbc8 12.2.0.1 в своем проекте maven и хочу уведомить, когда в таблице появится новая запись. Я использовал ojdbc7 11.2.0.1 и oracle 11g, и на этом все работало нормально. Сейчас я обновляюсь до oracle 12 c, для которого я использую ojdbc8 12.2.0.1 jar.

Таблица попадает в таблицу 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();
    }
}

Примечание: пожалуйста, игнорируйте синтаксическую ошибку, если таковая имеется.

...