我有一個Java web應用程序(部署到Tomcat的WAR),用於在內存中保存緩存(Map<Long,Widget>
)。我有一個包含widgets
表Postgres數據庫:Postgres觸發器更新Java緩存
widget_id | widget_name | widget_value
(INT) (VARCHAR 50) (INT)
爲O/R Widget
POJO和widgets
表記錄之間的映射,我使用MyBatis的。我希望實現一個解決方案,即只要widgets
表中的值發生更改,Java緩存(地圖)就會實時更新。我可能有一個輪詢組件,每隔30秒檢查一次表,但輪詢只是覺得這裏不是正確的解決方案。因此,這裏就是我提議:
- 寫Postgres的觸發器調用存儲過程(
run_cache_updater()
) - 在轉彎的過程中運行一個shell腳本(
run_cache_updater.sh
) - 腳本基礎-64編碼更改了
widgets
記錄,然後將編碼的記錄捲曲到HTTP URL - Java WAR有一個servlet監聽cURLed URL並處理髮送給它的任何
HttpServletRequests
。它base-64解碼記錄並以某種方式將其轉換成POJOWidget
。 - 使用正確的鍵/值更新緩存(
Map<Long,Widget>
)。
該解決方案感覺不方便,所以我想首先任何Java/Postgres的大師們如何有會處理這樣的情況。在這裏投票選擇更好/更簡單的選擇(我只是固執?)有沒有另一種/更好/更標準的解決方案,我忽略了?
如果沒有,並且此解決方案是將已更改的記錄從Postgres推送到應用程序層的標準方式,那麼我窒息瞭如何編寫觸發器,存儲過程和shell腳本,以便整個widgets
記錄獲取傳入cURL聲明。在此先感謝您的幫助。
哇 - 真棒回答@willglynn(+1) - 只是好奇:我假設我可以通過JDBC運行'LISTEN'? 'PgNotificationPoller'就是Postgres在底層運行的東西,還是我需要添加到我的項目中才能使此NOTIFY/LISTEN模型起作用?再次感謝! – IAmYourFaja
'LISTEN'是一個命令,它使PostgreSQL異步地將通知推送到你的連接,並在常規協議操作旁邊傳送特殊的'NOTIFY'相關消息。但是,JDBC驅動程序處理這些通知的方式有些特殊性(由於SSL限制),所以[顯然您需要發出垃圾查詢](http://postgresql.1045698.n5.nabble.com/-td2172662。 html)('「」')讓驅動程序看到通知可用。這比'libpq'更糟糕,它[不需要往返](http://bit.ly/Yt8txO),但仍然會跳動輪詢表。 – willglynn
爲了更直接地回答你的問題,我發現''PgNotificationPoller'及其朋友['PgNotificationHelper'](http://wiki.postgresql.org/wiki/PgNotificationHelper)是我發現的兩件事,它們演示了JDBC'getNotifications()'功能。您可以使用這些或按照[驅動程序文檔](http://jdbc.postgresql.org/documentation/91/listennotify.html)中所述自行完成。 – willglynn