sql >> データベース >  >> RDS >> PostgreSQL

LISTEN / NOTIFY pgconnectionがJavaをダウンしますか?

    通知リスナーは、そのライブラリによって弱参照として内部的に維持されます。つまり、ガベージコレクションが行われないように、外部でハード参照を保持する必要があります。 BasicContextクラスの行642〜655を確認してください:

    public void addNotificationListener(String name, String channelNameFilter, NotificationListener listener) {
    
        name = nullToEmpty(name);
        channelNameFilter = channelNameFilter != null ? channelNameFilter : ".*";
    
        Pattern channelNameFilterPattern = Pattern.compile(channelNameFilter);
    
        NotificationKey key = new NotificationKey(name, channelNameFilterPattern);
    
        synchronized (notificationListeners) {
          notificationListeners.put(key, new WeakReference<NotificationListener>(listener));
        }
    
    }
    

    GCがリスナーを取得した場合、弱参照で「get」を呼び出すとnullが返され、690〜710行目からわかるように起動しません。

      @Override
      public synchronized void reportNotification(int processId, String channelName, String payload) {
    
        Iterator<Map.Entry<NotificationKey, WeakReference<NotificationListener>>> iter = notificationListeners.entrySet().iterator();
        while (iter.hasNext()) {
    
          Map.Entry<NotificationKey, WeakReference<NotificationListener>> entry = iter.next();
    
          NotificationListener listener = entry.getValue().get();
          if (listener == null) {
    
            iter.remove();
          }
          else if (entry.getKey().channelNameFilter.matcher(channelName).matches()) {
    
            listener.notification(processId, channelName, payload);
          }
    
        }
    
    }
    

    これを修正するには、通知リスナーを次のように追加します。

    /// Do not let this reference go out of scope!
        PGNotificationListener listener = new PGNotificationListener() {
    
        @Override
        public void notification(int processId, String channelName, String payload) {
            // interesting code
        };
    };
        pgConnection.addNotificationListener(listener);
    

    私の意見では、弱い参照の非常に奇妙なユースケース...




    1. SSRSはレポートから列を削除します

    2. 行を選択してカウントします

    3. 単一のテーブルにMergeステートメントを使用する

    4. MySQL接続のPHPオブジェクトの継承を再利用する