Ik kan niet met MyBatis praten, maar ik kan je vertellen dat PostgreSQL een publish/subscribe-systeem heeft ingebouwd, waardoor je dit met veel minder hacking kunt doen.
Stel eerst een trigger in op widgets
die bij elke invoeg-, update- en verwijderbewerking wordt uitgevoerd. Laat het de primaire sleutel extraheren en NOTIFY
widgets_changed, id
. (Nou, van PL/pgSQL wil je waarschijnlijk PERFORM pg_notify(...)
.) PostgreSQL zal uw melding uitzenden als en wanneer die transactie wordt doorgevoerd, waardoor zowel de melding als de bijbehorende gegevenswijzigingen zichtbaar zijn voor andere verbindingen.
In de client zou je een thread willen starten die is bedoeld om deze kaart up-to-date te houden. Het zou verbinding maken met PostgreSQL, LISTEN
widgets_changed
om wachtrijmeldingen te starten, SELECT * FROM widgets
om de kaart te vullen en te wachten tot er meldingen binnenkomen. (Het controleren op meldingen behelst blijkbaar het peilen van het JDBC-stuurprogramma
, wat klote is, maar niet zo erg als je zou denken. Zie PgNotificationPoller
voor een concrete implementatie.) Zodra u een melding ziet, zoekt u het aangegeven record op en werkt u uw kaart bij. Merk op dat het belangrijk is om LISTEN
voor de eerste SELECT *
, aangezien records kunnen worden gewijzigd tussen SELECT *
en LISTEN
.
Deze aanpak vereist niet dat PostgreSQL iets weet over uw toepassing. Het hoeft alleen maar meldingen te sturen; uw applicatie doet de rest. Er zijn geen shellscripts, geen HTTP en geen callbacks, zodat u uw toepassing opnieuw kunt configureren/opnieuw implementeren zonder ook de database opnieuw te hoeven configureren. Het is gewoon een database en er kan een back-up van worden gemaakt, worden hersteld, gerepliceerd, enz. zonder extra complicaties. Evenzo heeft uw applicatie geen extra complexiteit:het enige dat nodig is, is een verbinding met PostgreSQL, die u al heeft.