Vilken annan lösning har jag för det här problemet?
Använd LISTEN
och NOTIFY
för att berätta för din app att saker och ting har förändrats.
Du kan skicka NOTIFY
från en utlösare som också registrerar ändringar i en kötabell.
Du behöver en PgJDBC-anslutning som har skickat en LISTEN
för händelsen/evenemangen du använder. Den måste polla databasen genom att skicka periodiska tomma frågor (""
) om du använder SSL; om du inte använder SSL kan detta undvikas genom att använda kontrollerna av asynkrona meddelanden. Du måste packa upp Connection
objekt från din anslutningspool för att kunna casta den underliggande anslutningen till en PgConnection
att använda lyssna/notifiera med. Se relaterat svar
Producent/konsumentbiten blir svårare. För att ha flera kraschsäkra samtidiga konsumenter i PostgreSQL måste du använda rådgivande låsning med pg_try_advisory_lock(...)
. Om du inte behöver samtidiga konsumenter är det enkelt, du bara SELECT ... LIMIT 1 FOR UPDATE
en rad i taget.
Förhoppningsvis kommer 9.4 att innehålla en enklare metod för att hoppa över låsta rader med FOR UPDATE
, eftersom det finns arbete under utveckling för det.