1

私はjbossを使用しています.Hibernate基準クエリを使用してdbから読み取ったエンティティを実行するクラスがあります。

私はクエリを実装しました

// org.hibernate.Criteria crit ..
// crit.add(Restriction...
// crit.setProjections(...
List<MyObject> l = crit.list()

アプリケーションの実行中に、別のアプリケーションが db content を変更します。したがって、同じセッションで別の c.list() を使用して再度読み取ると、データは変更されていないように見えます。これは、休止状態のキャッシュが「古い」データを返すためです。

更新すると、次のようなことができます (EntityManager em から始めてセッションを取得します):

for (MyObject o : l) {
     ((Session)em.getDelegate()).refresh(o); 
}

それは機能し、オブジェクトのコンテンツを更新し、更新されたデータはキャッシュではなくデータベースから取得されます。しかし、リスト内のすべてのオブジェクトを 1 つずつ更新するため、これは非常に非効率的です。

別の方法は、セッションを閉じて再度開くことですが、私はそうしません。

((Session)em.getDelegate()).setCacheMode(CacheMode.REFRESH)私は withと withを試しましcrit.setCacheable(false)たが、どちらの場合も、すべての読み取り実行がキャッシュからのデータの「古い」バージョンを返します。

キャッシュからではなくデータベースからクエリを実行するようにセッション/基準に設定するための提案はありますか? 私のアプリケーションの使用では、キャッシュは問題ありませんが、上記で説明したように、データベース上のデータが外部から、別のアプリケーションの別のセッションから変更される場合を除きます。

ありがとうございました

4

0 に答える 0