Jeg kan ikke tale med MyBatis, men jeg kan fortælle dig, at PostgreSQL har et publicerings-/abonnementssystem indbygget, som ville lade dig gøre dette med meget mindre hackeri.
Først skal du konfigurere en trigger på widgets
der kører ved hver indsættelse, opdatering og sletning. Få den til at udtrække den primære nøgle og NOTIFY
widgets_changed, id
. (Nå, fra PL/pgSQL vil du sikkert gerne have PERFORM pg_notify(...)
.) PostgreSQL vil udsende din notifikation, hvis og når transaktionen forpligtes, hvilket gør både notifikationen og de tilsvarende dataændringer synlige for andre forbindelser.
I klienten vil du gerne køre en tråd dedikeret til at holde dette kort opdateret. Det ville oprette forbindelse til PostgreSQL, LISTEN
widgets_changed
SELECT * FROM widgets
for at begynde at sætte meddelelser i kø for at udfylde kortet og vente på, at der kommer notifikationer. (At søge efter meddelelser indebærer åbenbart polling af JDBC-driveren
, hvilket stinker, men ikke så slemt, som du måske tror. Se PgNotificationPoller
for en konkret implementering.) Når du ser en meddelelse, skal du slå den angivne post op og opdatere dit kort. Bemærk, at det er vigtigt at LISTEN
før den indledende SELECT *
, da poster kunne ændres mellem SELECT *
og LISTEN
.
Denne tilgang kræver ikke, at PostgreSQL ved noget om din applikation. Alt det skal gøre er at sende meddelelser; din ansøgning klarer resten. Der er ingen shell-scripts, ingen HTTP og ingen tilbagekald, hvilket giver dig mulighed for at omkonfigurere/ominstallere din applikation uden også at skulle rekonfigurere databasen. Det er bare en database, og den kan sikkerhedskopieres, gendannes, replikeres osv. uden ekstra komplikationer. På samme måde har din applikation ingen ekstra kompleksitet:alt den behøver er en forbindelse til PostgreSQL, som du allerede har.