1

この質問は私の他の質問に関連しています

休止状態を使用して DB からデータを読み取る Spring Web アプリケーションを構築しています。私のアプリは、DB に対して行われた変更 (更新/挿入) を認識しません。このようなシナリオでクエリ キャッシュを使用する方法はありますか?

クエリ キャッシュを構成しましたが、別のアプリから DB を更新してもキャッシュが無効になりません。そして、それは期待される動作だと思います。

DB に更新がある場合、クエリをキャッシュして無効にする必要があります。これを達成する方法は?

4

2 に答える 2

1

キャッシュを自動的に更新する方法があるかどうかはわかりません。しかし、私は私の最後のプロジェクトでこの問題を解決しました。以下のような方法を公開し、管理者にアクセスを許可します。DBで変更が行われたら、このメソッドを外部から呼び出してキャッシュを更新します。

public void refreshCache()
    {
        try {
            Map<String, ClassMetadata> classesMetadata = sessionFactory.getAllClassMetadata();
            for (String entityName : classesMetadata.keySet()) {

                sessionFactory.evictEntity(entityName);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
于 2013-02-08T04:11:08.367 に答える
0

Oracleを使用している場合は、次のコマンドを実行すると、テーブル上で最後に更新された一意のscnが表示されます。

select max(ora_rowscn) from TableName;

出力

10772982279880

さらに、必要に応じてこれをタイムスタンプに変換します

select scn_to_timestamp(10772982279880) from dual

しかし、それを時間に変換する必要があるとは思いません。rowscnだけをキャッシュし、定期的にテーブルをチェックしてください。変更がある場合は、キャッシュ領域を削除できます。

Please note that this supports version > 10g
于 2013-02-08T10:13:13.103 に答える