De registreringer, du har bevaret i user_change_notification_regs
tabel skal slettes eksplicit, da DBMS ikke holder styr på den 'JDBC-forbindelsen, som forberedte denne forbindelse, er stadig i live' som kræver en hjerteslagsmekanisme. Når din server genstarter, skal du derfor udtrykkeligt slette (afregistrere) disse poster. Her er et eksempel.
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 simpelthen sætte denne kode i en statisk blok af en klasse eller en initialiseringsmetode, som kun vil blive udført én gang. Hvis du indstiller en timeout for lytteren, aktiverer oracle server side driver hjerteslagsmekanismen for din forbindelse, hvilket kan reducere applikationens ydeevne en smule.