Записите, които сте запазили в user_change_notification_regs
таблицата трябва да бъде изтрита изрично, тъй като СУБД не следи това „JDBC връзката, която подготви тази връзка, е все още жива“ което изисква механизъм за сърдечен ритъм. Следователно, когато вашият сървър се рестартира, трябва изрично да изтриете (дерегистрирате) тези записи. Ето един пример.
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);
}
Можете просто да поставите този код в статичен блок на клас или инициализиращ метод, който ще бъде изпълнен само веднъж. Ако зададете таймаут за слушателя, драйверът от страна на сървъра на Oracle активира механизма за сърдечен ритъм за вашата връзка, което може леко да намали производителността на приложението.