キャッシュ()をメモリに保持するJava Webアプリ(TomcatにWARをデプロイMap<Long,Widget>)があります。テーブルを含むPostgresデータベースがありwidgetsます:
widget_id | widget_name | widget_value
(INT) (VARCHAR 50) (INT)
WidgetPOJOとテーブルレコード間の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ステートメントに渡されるように、トリガー、ストアドプロシージャ、およびシェルスクリプトを作成する方法を検討しています。。ここで助けてくれてありがとう。