Je ne peux pas parler de MyBatis, mais je peux vous dire que PostgreSQL a un système de publication/abonnement intégré, ce qui vous permettrait de le faire avec beaucoup moins de piratage.
Tout d'abord, configurez un déclencheur sur widgets
qui s'exécute à chaque opération d'insertion, de mise à jour et de suppression. Faites-lui extraire la clé primaire et NOTIFY
widgets_changed, id
. (Eh bien, depuis PL/pgSQL, vous voudriez probablement PERFORM pg_notify(...)
.) PostgreSQL diffusera votre notification si et quand cette transaction est validée, rendant à la fois la notification et les modifications de données correspondantes visibles pour les autres connexions.
Dans le client, vous souhaitez exécuter un fil dédié à la mise à jour de cette carte. Il se connecterait à PostgreSQL, LISTEN
widgets_changed
pour démarrer la mise en file d'attente des notifications, SELECT * FROM widgets
pour remplir la carte et attendez que les notifications arrivent. (La vérification des notifications apparemment implique l'interrogation du pilote JDBC
, qui craint, mais pas aussi mauvais que vous pourriez le penser. Voir PgNotificationPoller
pour une mise en œuvre concrète.) Une fois que vous voyez une notification, recherchez l'enregistrement indiqué et mettez à jour votre carte. Notez qu'il est important d'LISTEN
avant le SELECT *
initial , puisque les enregistrements peuvent être modifiés entre SELECT *
et LISTEN
.
Cette approche ne nécessite pas que PostgreSQL sache quoi que ce soit sur votre application. Tout ce qu'il a à faire est d'envoyer des notifications; votre application fait le reste. Il n'y a pas de scripts shell, pas de HTTP et pas de rappels, ce qui vous permet de reconfigurer/redéployer votre application sans avoir à reconfigurer également la base de données. C'est juste une base de données, et elle peut être sauvegardée, restaurée, répliquée, etc. sans complications supplémentaires. De même, votre application n'a aucune complexité supplémentaire :tout ce dont elle a besoin est une connexion à PostgreSQL, que vous avez déjà.