Oracle
 sql >> Base de données >  >> RDS >> Oracle

Délai d'expiration de la notification de modification des données Oracle et flux de travail

Les enregistrements que vous avez conservés dans user_change_notification_regs la table doit être supprimée explicitement car le SGBD ne garde pas la trace de cette 'La connexion JDBC qui a préparé cette connexion est toujours active' qui nécessite un mécanisme de battement cardiaque. Par conséquent, lorsque votre serveur redémarre, vous devez explicitement supprimer (désenregistrer) ces enregistrements. Voici un exemple.

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

Vous pouvez simplement mettre ce code dans un bloc statique d'une classe ou d'une méthode d'initialisation qui ne sera exécutée qu'une seule fois. Si vous définissez un délai d'expiration pour l'écouteur, le pilote côté serveur oracle active le mécanisme de pulsation pour votre connexion, ce qui pourrait légèrement réduire les performances de l'application.