Welche andere Lösung habe ich für dieses Problem?
Verwenden Sie LISTEN
und NOTIFY
um Ihrer App mitzuteilen, dass sich etwas geändert hat.
Sie können den NOTIFY
senden von einem Trigger, der auch Änderungen in einer Warteschlangentabelle aufzeichnet.
Sie benötigen eine PgJDBC-Verbindung, die ein LISTEN
gesendet hat für die Veranstaltung(en), die Sie verwenden. Es muss die Datenbank abfragen, indem es periodisch leere Abfragen sendet (""
). ), wenn Sie SSL verwenden; Wenn Sie kein SSL verwenden, kann dies durch die Verwendung der asynchronen Benachrichtigungsprüfungen vermieden werden. Sie müssen die Connection
entpacken -Objekt aus Ihrem Verbindungspool, um die zugrunde liegende Verbindung in eine PgConnection
umwandeln zu können zu hören/benachrichtigen mit verwenden. Siehe zugehörige Antwort
Das Producer/Consumer-Bit wird schwieriger sein. Um mehrere absturzsichere Concurrent Consumer in PostgreSQL zu haben, müssen Sie Advisory Locking mit pg_try_advisory_lock(...)
verwenden . Wenn Sie keine gleichzeitigen Verbraucher benötigen, ist es ganz einfach, SELECT ... LIMIT 1 FOR UPDATE
eine Zeile nach der anderen.
Hoffentlich enthält 9.4 eine einfachere Methode zum Überspringen gesperrter Zeilen mit FOR UPDATE
, da dafür noch Entwicklungsarbeit geleistet wird.