Non posso parlare con MyBatis, ma posso dirti che PostgreSQL ha un sistema di pubblicazione/sottoscrizione integrato, che ti permetterebbe di farlo con molto meno hackeraggio.
Innanzitutto, imposta un attivatore su widgets
che viene eseguito su ogni operazione di inserimento, aggiornamento ed eliminazione. Fagli estrarre la chiave primaria e NOTIFY
widgets_changed, id
. (Beh, da PL/pgSQL, probabilmente vorresti PERFORM pg_notify(...)
.) PostgreSQL trasmetterà la tua notifica se e quando la transazione viene confermata, rendendo visibili sia la notifica che le modifiche ai dati corrispondenti ad altre connessioni.
Nel client, vorresti eseguire un thread dedicato a mantenere aggiornata questa mappa. Si collegherebbe a PostgreSQL, LISTEN
widgets_changed
per iniziare a mettere in coda le notifiche, SELECT * FROM widgets
per popolare la mappa e attendere l'arrivo delle notifiche. (Il controllo delle notifiche apparentemente comporta il polling del driver JDBC
, che fa schifo, ma non così male come potresti pensare. Vedi PgNotificationPoller
per un'implementazione concreta.) Quando vedi una notifica, cerca il record indicato e aggiorna la tua mappa. Nota che è importante LISTEN
prima dell'iniziale SELECT *
, poiché i record possono essere modificati tra SELECT *
e LISTEN
.
Questo approccio non richiede a PostgreSQL di sapere nulla della tua applicazione. Tutto quello che deve fare è inviare notifiche; la tua applicazione fa il resto. Non ci sono script di shell, HTTP e callback, consentendoti di riconfigurare/ridistribuire la tua applicazione senza dover riconfigurare anche il database. È solo un database e può essere eseguito il backup, il ripristino, la replica, ecc. senza complicazioni aggiuntive. Allo stesso modo, la tua applicazione non ha ulteriori complessità:tutto ciò di cui ha bisogno è una connessione a PostgreSQL, che hai già.