sql >> Databasteknik >  >> RDS >> PostgreSQL

Postgres trigger för att uppdatera Java-cache

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.




  1. Problem med att använda/visa specialtecken från Oracle db i .Net-appen

  2. Vad är datatypen för unix_timestamp (MySQL)?

  3. Hur jag tar bort dubbletter från listagg

  4. Hur får jag mitt glömda MySQL-lösenord från MySQL Workbench på macOS?