Jakie mam inne rozwiązanie tego problemu?
Użyj LISTEN
i NOTIFY
aby poinformować aplikację, że coś się zmieniło.
Możesz wysłać NOTIFY
z wyzwalacza, który rejestruje również zmiany w tabeli kolejki.
Będziesz potrzebować połączenia PgJDBC, które wysłało LISTEN
dla wydarzeń, z których korzystasz. Musi odpytywać bazę danych, wysyłając okresowe puste zapytania (""
), jeśli używasz SSL; jeśli nie używasz SSL, można tego uniknąć, korzystając z kontroli powiadomień asynchronicznych. Musisz rozpakować Connection
obiekt z puli połączeń, aby móc rzutować podstawowe połączenie na PgConnection
do korzystania z funkcji nasłuchiwania/powiadamiania. Zobacz pokrewną odpowiedź
Bit producent/konsument będzie trudniejszy. Aby mieć wielu jednoczesnych konsumentów odpornych na awarie w PostgreSQL, musisz użyć blokowania doradczego z pg_try_advisory_lock(...)
. Jeśli nie potrzebujesz jednoczesnych konsumentów, to jest to łatwe, po prostu SELECT ... LIMIT 1 FOR UPDATE
wiersz na raz.
Mam nadzieję, że 9.4 będzie zawierał łatwiejszą metodę pomijania zablokowanych wierszy za pomocą FOR UPDATE
, ponieważ trwają prace nad tym rozwojem.