Nie mogę rozmawiać z MyBatis, ale mogę powiedzieć, że PostgreSQL ma wbudowany system publikowania/subskrypcji, który pozwala na zrobienie tego przy znacznie mniejszej ilości hackerów.
Najpierw skonfiguruj wyzwalacz dla widgets
który działa przy każdej operacji wstawiania, aktualizowania i usuwania. Poproś go o wyodrębnienie klucza podstawowego i NOTIFY
widgets_changed, id
. (Cóż, z PL/pgSQL prawdopodobnie chciałbyś PERFORM pg_notify(...)
.) PostgreSQL wyśle twoje powiadomienie, jeśli i kiedy transakcja zostanie zatwierdzona, dzięki czemu zarówno powiadomienie, jak i odpowiednie zmiany danych będą widoczne dla innych połączeń.
W kliencie chciałbyś uruchomić wątek poświęcony aktualizowaniu tej mapy. Połączyłby się z PostgreSQL, LISTEN
widgets_changed
aby rozpocząć kolejkowanie powiadomień, SELECT * FROM widgets
aby wypełnić mapę i poczekać na przybycie powiadomień. (Sprawdzanie powiadomień najwyraźniej wymaga odpytywania sterownika JDBC
, co jest do bani, ale nie tak złe, jak mogłoby się wydawać. Zobacz PgNotificationPoller
dla konkretnego wdrożenia.) Gdy zobaczysz powiadomienie, wyszukaj wskazany rekord i zaktualizuj swoją mapę. Pamiętaj, że ważne jest, aby LISTEN
przed początkowym SELECT *
, ponieważ rekordy można zmieniać między SELECT *
i LISTEN
.
Takie podejście nie wymaga, aby PostgreSQL wiedział cokolwiek o Twojej aplikacji. Wystarczy, że wyślesz powiadomienia; Twoja aplikacja zajmie się resztą. Nie ma skryptów powłoki, HTTP ani wywołań zwrotnych, co pozwala na rekonfigurację/ponowne wdrożenie aplikacji bez konieczności ponownego konfigurowania bazy danych. To tylko baza danych, którą można tworzyć, przywracać, replikować itp. bez dodatkowych komplikacji. Podobnie Twoja aplikacja nie ma żadnych dodatkowych złożoności:wszystko, czego potrzebuje, to połączenie z PostgreSQL, które już masz.