Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Tempo limite de notificação de alteração de dados Oracle e fluxo de trabalho


Os registros que você persistiu em user_change_notification_regs A tabela deve ser excluída explicitamente, pois o DBMS não acompanha isso 'A conexão JDBC que preparou esta conexão ainda está ativa' que requer um mecanismo de batimento cardíaco. Portanto, quando o servidor for reiniciado, você precisará excluir (cancelar o registro) esses registros explicitamente. Aqui está um exemplo.
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);
        } 

Você pode simplesmente colocar este código em um bloco estático de uma classe ou um método de inicialização que será executado apenas uma vez. Se você definir um tempo limite para o ouvinte, o driver do lado do servidor Oracle habilita o mecanismo de batimento cardíaco para sua conexão, o que pode diminuir um pouco o desempenho do aplicativo.