Rekordy, które utrwaliłeś w user_change_notification_regs
tabela musi zostać wyraźnie usunięta, ponieważ DBMS nie śledzi tego 'Połączenie JDBC, które przygotowało to połączenie, jest nadal aktywne' co wymaga mechanizmu bicia serca. Dlatego po ponownym uruchomieniu serwera musisz jawnie usunąć (wyrejestrować) te rekordy. Oto przykład.
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);
}
Możesz po prostu umieścić ten kod w statycznym bloku klasy lub metody inicjującej, która zostanie wykonana tylko raz. Jeśli ustawisz limit czasu dla słuchacza, sterownik Oracle po stronie serwera włączy mechanizm bicia serca dla Twojego połączenia, co może nieznacznie obniżyć wydajność aplikacji.