user_change_notification_regs
に永続化したレコード DBMSはその「この接続を準備した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);
}
このコードは、クラスの静的ブロックまたは1回だけ実行される初期化メソッドに配置するだけです。リスナーにタイムアウトを設定すると、Oracleサーバー側のドライバーが接続のハートビートメカニズムを有効にし、アプリケーションのパフォーマンスをわずかに低下させる可能性があります。