キャッシュ()をメモリに保持するJava Webアプリ(TomcatにWARをデプロイMap<Long,Widget>
)があります。テーブルを含むPostgresデータベースがありwidgets
ます:
widget_id | widget_name | widget_value
(INT) (VARCHAR 50) (INT)
Widget
POJOとテーブルレコード間のO/Rマップwidgets
には、MyBatisを使用しています。widgets
テーブルの値が変更されるたびにJavaキャッシュ(マップ)がリアルタイムで更新されるソリューションを実装したいと思います。たとえば、30秒ごとにテーブルをチェックするポーリングコンポーネントを使用することもできますが、ここではポーリングが適切な解決策とは思えません。これが私が提案していることです:
- ストアドプロシージャを呼び出すPostgresトリガーを記述します(
run_cache_updater()
) - プロシージャは順番にシェルスクリプトを実行します(
run_cache_updater.sh
) - スクリプトbase-64は、変更され
widgets
たレコードをエンコードしてから、エンコードされたレコードをHTTPURLにcURLします - Java WARには、cURLされたURLをリッスンするサーブレットがあり、それ
HttpServletRequests
に送信されたものを処理します。Widget
それはbase-64でレコードをデコードし、どういうわけかそれをPOJOに変換します。 - キャッシュ(
Map<Long,Widget>
)は正しいキー/値で更新されます。
このソリューションは扱いにくいと感じるので、私は最初に、そこにあるJava/Postgresの達人がそのような状況をどのように処理するのか疑問に思っています。ここでポーリングはより良い/より単純な選択ですか(私は頑固ですか?)私が見落としている別の/より良い/より標準的な解決策はありますか?
widgets
そうでない場合、このソリューションが変更されたレコードをPostgresからアプリケーション層にプッシュする標準的な方法である場合、レコード全体がcURLステートメントに渡されるように、トリガー、ストアドプロシージャ、およびシェルスクリプトを作成する方法を検討しています。。ここで助けてくれてありがとう。