2011-12-08 6 views
1

キャッシングと休止に関する多くの質問がありましたが、私の問題の解決策を見つけることはできませんでした。ほとんどの質問はJPAを使わずに直接hibernateを使って参照します。休止状態キャッシングを無効にする

JPAプロバイダとして設定されたHibernateでSpringを使用しています。アプリケーション自体は、JSFを使用するWebアプリケーションです。基になるデータベースはSQL Server 2008です。

JPA仕様では、persistence.xmlに以下を追加しました。

<shared-cache-mode>NONE</shared-cache-mode> 

Hibernateは多かれ少なかれ無視しているようです。 Hibernate documentationは、これによって第2レベルのキャッシュが無効になることを示しています。しかし、私たちのアプリケーションでは、3番目のアプリケーションが終了するたびに一部のデータが変更されるため、データベースからの最新のデータが必要になります。

キャッシングを無効にするにはどうすればよいですか?

@PersistenceContext(type=PersistenceContextType.EXTENDED) 
private EntityManager em; 
... 
return em.createQuery("SELECT mt FROM " + MyTable.class.getSimpleName() + " mt", 
         MyTable.class).getResultList(); 

私がアプリケーションを起動し、テーブルを照会しているブラウザでページを読み込む@axtavt :私たちは、のようなクエリでデータにJPAの道を得ています。 私は自分のDBMSに切り替えて、テーブルの更新を行います。 2番目のブラウザを開いても、古いデータが表示され、更新されたデータは表示されません。

更新 さらにテストを実行しました。私はEXTENDED@PersistenceContextを使っていました。私はここにそれを加えた。しかし、それを取り除いても問題はありません。

+0

何が問題なのですか?なぜHibernateはその設定を無視すると思いますか? – axtavt

+0

_Hibernateが多かれ少なかれそれを無視するように見えることを明確にしてください:問題の例を挙げてください。第2レベルのキャッシュを有効にすることに加えて、エンティティとクエリをキャッシュ可能に設定して機能させる必要があるため、第2レベルのキャッシュはここでは問題にならないはずです。第2レベルのキャッシュについての非常に良い記事が見つかりました[ここ](http://www.javalobby.org/java/forums/t48846.html) – tscho

+0

@axtavtメインのポストにアップデートを追加しました。 –

答えて

1

あなたのトランザクションはコミットされておらず、他のブラウザにはまだ古いデータが表示されているようです。

EXTENDEDソリューションを使用したことはありませんでしたが、私が知る限り、EXTENDEDを使用すると、長期トランザクションをコミットして他のトランザクションが結果を確認できるようにする必要があります。 EXTENDED persistence contextタイプを使用してトランザクションをコミットする方法を調べてください。

2

hibernateでは、hibernateセッション自体が第1レベルのキャッシュとして機能するため、hibernateでは第2レベルのキャッシュと呼ばれます。セッション(永続コンテキスト)は通常、オブジェクト関係が正しく維持されるように、@Transactionalメソッドの間だけオブジェクトをキャッシュします。

2番目のレベルのキャッシュを無効にする必要があります。リクエスト中は一貫性のあるデータが必要ですが、リクエスト間にはキャッシュがないので、次のリクエストではすべてのデータが再びフレッシュです。

+0

これは動作しない部分です。上記のアップデートをご確認ください。 –

0

さらにテストを実施しました。私はEXTENDED@PersistenceContextを使っていました。私はメインポストに追加しました。 EXTENDEDを削除すると、リフレッシュが機能します。しかし、私は別の問題に遭遇します...