Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Timeout und Workflow für Oracle-Datenänderungsbenachrichtigungen

Die Aufzeichnungen, die Sie in user_change_notification_regs beibehalten haben Die Tabelle muss explizit gelöscht werden, da das DBMS nicht nachverfolgt, dass 'Die JDBC-Verbindung, die diese Verbindung hergestellt hat, noch aktiv ist' was einen Herzschlagmechanismus erfordert. Wenn Ihr Server neu gestartet wird, müssen Sie diese Datensätze daher explizit löschen (deregistrieren). Hier ist ein Beispiel.

try (Connection conn = ConnManager.getConnection();) {
         if (conn.isWrapperFor(OracleConnection.class)) {

                try (OracleConnection oracleConnection = conn.unwrap(OracleConnection.class);
                        Statement stmt = oracleConnection.createStatement()) {
                    ResultSet rs = stmt.executeQuery("select regid,callback from USER_CHANGE_NOTIFICATION_REGS");

                    while (rs.next()) {
                        long regid = rs.getLong(1);
                        String callback = rs.getString(2);
                        ((OracleConnection) stmt.getConnection()).unregisterDatabaseChangeNotification(regid, callback);
                    }
                }
            }
        } catch (SQLException ex) {
            Logger.getLogger(TableBase.class.getName()).log(Level.SEVERE, null, ex);
        } 

Sie können diesen Code einfach in einen statischen Block einer Klasse oder einer Initialisierungsmethode einfügen, die nur einmal ausgeführt wird. Wenn Sie eine Zeitüberschreitung für den Listener festlegen, aktiviert der serverseitige Oracle-Treiber den Heartbeat-Mechanismus für Ihre Verbindung, was die Anwendungsleistung leicht beeinträchtigen kann.