Oracle
 sql >> Database >  >> RDS >> Oracle

Timeout e flusso di lavoro della notifica di modifica dei dati Oracle

I record che hai mantenuto in user_change_notification_regs la tabella deve essere eliminata in modo esplicito poiché DBMS non tiene traccia di quella 'La connessione JDBC che ha preparato questa connessione è ancora attiva' che richiede un meccanismo di battito cardiaco. Pertanto, quando il tuo server si riavvia, devi eliminare (annullare) esplicitamente quei record. Ecco un esempio.

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);
        } 

Puoi semplicemente inserire questo codice in un blocco statico di una classe o in un metodo di inizializzazione che verrà eseguito solo una volta. Se imposti un timeout per l'ascoltatore, il driver lato server Oracle abilita il meccanismo del battito cardiaco per la tua connessione che potrebbe ridurre leggermente le prestazioni dell'applicazione.