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.