sql >> Databasteknik >  >> RDS >> Oracle

Oracle Data Change Notification Timeout och arbetsflöde

Posterna du har kvar i user_change_notification_regs Tabellen måste raderas explicit eftersom DBMS inte håller reda på den 'JDBC-anslutningen som förberedde den här anslutningen är fortfarande vid liv' som kräver en hjärtslagsmekanism. När din server startar om måste du därför uttryckligen ta bort (avregistrera) dessa poster. Här är ett exempel.

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

Du kan helt enkelt lägga den här koden i ett statiskt block av en klass eller en initieringsmetod som endast kommer att köras en gång. Om du ställer in en timeout för lyssnaren, aktiverar oracle-serversidans drivrutin hjärtslagsmekanismen för din anslutning, vilket kan minska programmets prestanda något.



  1. Hur man kör 2 uppdateringsfrågor i en transaktion med JDBC

  2. Skapar partitionering i mysql tabeller eller bara virtuella tabeller?

  3. Hur tar man bort element av array i PostgreSQL?

  4. 2 sätt att få protokollet från ett Datetime-värde i Oracle Database