sql >> Databasteknik >  >> RDS >> PostgreSQL

LYSSNA/MEDDELA pgconnection går ner java?

Aviseringslyssnarna underhålls internt av det biblioteket som svaga referenser, vilket innebär att du måste hålla en hård referens externt så att de inte samlas in som skräp. Kolla in BasicContext-klassraderna 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));
    }

}

Om GC plockar upp din lyssnare kommer anrop för att "få" på den svaga referensen returnera null och kommer inte att avfyras som sett från raderna 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);
      }

    }

}

För att åtgärda detta, lägg till dina aviseringslyssnare som sådana:

/// 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);

Ett ganska udda användningsfall för svaga referenser enligt min mening...




  1. Varför är Datediff mellan GETDATE() och SYSDATETIME() i millisekunder alltid olika?

  2. skicka ett e-postmeddelande med mysql fetch records

  3. python odo sql AssertionError:dataform måste vara posttyp, fick 0 * {...}

  4. TXT-fil eller databas?