Quale altra soluzione ho per questo problema?
Usa LISTEN
e NOTIFY
per dire alla tua app che le cose sono cambiate.
Puoi inviare il NOTIFY
da un trigger che registra anche le modifiche in una tabella di coda.
Avrai bisogno di una connessione PgJDBC che abbia inviato un LISTEN
per gli eventi che stai utilizzando. Deve eseguire il polling del database inviando periodiche query vuote (""
) se stai usando SSL; se non si utilizza SSL, ciò può essere evitato utilizzando i controlli di notifica asincrona. Dovrai scartare la Connection
oggetto dal pool di connessioni per poter eseguire il cast della connessione sottostante a un PgConnection
utilizzare ascolta/notifica con. Vedi risposta correlata
Il bit produttore/consumatore sarà più difficile. Per avere più consumer simultanei a prova di crash in PostgreSQL è necessario utilizzare il blocco di avviso con pg_try_advisory_lock(...)
. Se non hai bisogno di consumatori simultanei, allora è facile, basta SELECT ... LIMIT 1 FOR UPDATE
una riga alla volta.
Si spera che 9.4 includa un metodo più semplice per saltare le righe bloccate con FOR UPDATE
, poiché c'è del lavoro in fase di sviluppo.