Los registros que ha persistido en user_change_notification_regs
la tabla debe eliminarse explícitamente ya que DBMS no realiza un seguimiento de eso 'La conexión JDBC que preparó esta conexión todavía está activa' que requiere un mecanismo de latido del corazón. Por lo tanto, cuando su servidor se reinicia, debe eliminar explícitamente (anular el registro) esos registros. Aquí hay un ejemplo.
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);
}
Simplemente puede poner este código en un bloque estático de una clase o un método de inicialización que se ejecutará solo una vez. Si configura un tiempo de espera para el oyente, el controlador del lado del servidor de Oracle habilita el mecanismo de latido del corazón para su conexión, lo que podría disminuir ligeramente el rendimiento de la aplicación.