Jag kan inte prata med MyBatis, men jag kan berätta att PostgreSQL har ett system för publicering/prenumeration inbyggt, vilket skulle låta dig göra detta med mycket mindre hackeri.
Ställ först in en trigger på widgets
som körs vid varje infogning, uppdatering och radering. Låt den extrahera primärnyckeln och NOTIFY
widgets_changed, id
. (Tja, från PL/pgSQL skulle du förmodligen vilja ha PERFORM pg_notify(...)
.) PostgreSQL kommer att sända ditt meddelande om och när transaktionen genomförs, vilket gör både meddelandet och motsvarande dataändringar synliga för andra anslutningar.
I klienten skulle du vilja köra en tråd dedikerad till att hålla denna karta uppdaterad. Det skulle ansluta till PostgreSQL, LISTEN
widgets_changed
för att börja köa aviseringar, SELECT * FROM widgets
för att fylla kartan och vänta på att meddelanden kommer. (Att leta efter aviseringar innebär tydligen polling av JDBC-drivrutinen
, vilket suger, men inte så illa som man kan tro. Se PgNotificationPoller
för en konkret implementering.) När du ser ett meddelande, slå upp den angivna posten och uppdatera din karta. Observera att det är viktigt att LISTEN
före den initiala SELECT *
, eftersom poster kan ändras mellan SELECT *
och LISTEN
.
Detta tillvägagångssätt kräver inte att PostgreSQL vet något om din applikation. Allt det behöver göra är att skicka meddelanden; din ansökan gör resten. Det finns inga skalskript, inga HTTP och inga återuppringningar, vilket gör att du kan konfigurera om/distribuera om din applikation utan att behöva konfigurera om databasen. Det är bara en databas, och den kan säkerhetskopieras, återställas, replikeras, etc. utan extra komplikationer. På samma sätt har din applikation inga extra komplexiteter:allt den behöver är en anslutning till PostgreSQL, som du redan har.