2009-03-22 16 views
1

私は、Hibernateを使用してMYSQL DBにアクセスするStrutsアプリケーションを持っています。私はDBに変更を加えるいくつかのページを持っています。これらの変更はうまくいき、データはDB内で更新されます。しかし、この更新された情報を頻繁に表示する必要があるページをブラウズすると、ページが更新された後でさえ、それはまだ存在しません。最終的にそれは上がるでしょう。私はこれが休止状態のキャッシングデータと関係があると仮定していますが、どのようにしてデータが最新であることを確認できますか?私はすべてが休止状態のセッションを通過したので、それが変更をピックアップすると仮定していましたか? 私は、更新を行うために使用しているコードは次のとおりです。 変更を反映しないHibernate

hSession = HibernateUtil.getSessionFactory().getCurrentSession(); 
    Transaction tx = hSession.getTransaction(); 
    tx.begin(); 
    hSession.update(user) ; 

が続いて再びそのユーザーを引っ張って:

org.hibernate.Session hSession = HibernateUtil.getSessionFactory() 
.getCurrentSession(); 
Transaction tx = hSession.beginTransaction(); 
User u= (User) hSession.load(User.class, userID); 

答えて

3

本当に答えを出すための情報しかし、いくつかのチェックポイント:

  • あなたは取引を使用しています。あなたはそれらを適切にコミットしていますか?たぶん、あなたのコードはまだコミットされていない(または読み込みコードが以前の状態を使用する別のトランザクションにあるため)、変更を見ることができない場合もあります。

  • キャッシュに問題がある可能性があります。チェックするには、DB(Session.flush())を変更するたびに明示的にキャッシュをフラッシュすることができます。これはおそらくパフォーマンスを低下させますが、問題の絞り込みに役立ちます。

+0

はい、上記の設定でトランザクションを明示的にコミットする必要があります。 – javashlook

1

それはおそらくsecond level (session factory) hibernate cacheの結果です。

キャッシュ透明で、あなたが与えたコードで正常に動作しますが、ときに問題は通常発生する必要があります:あなたがマシンのクラスタを実行しているとキャッシュがそれぞれを無効にするための方法を持っていない

  1. other configured
  2. hibernateの外部でデータベースを更新しています。

第2レベルのキャッシュの問題であるかどうかを判断する最も簡単な方法は、休止状態の設定でキャッシュを完全に無効にすることです。それがキャッシュの場合は、クラスタが自動的にキャッシュを管理できるようにクラスタを構成するか、外部の休止状態の更新で問題がある場合は、hibernate api

+0

これは単一のマシン(デベロッパーマシン)であり、唯一の変更は休止状態で行われますが、キャッシュを無効にして何が起こるかを確認します。 –

+0

複数のSessionFactoryオブジェクトが作成されている場合、1台のマシンで2次キャッシュの問題が表示されることがあります。各セッションファクトリは独立しており、別々の物理システム上にあるように機能します。別のWebアプリを持っている場合や、コードによって作成されている場合は、複数のアプリを持つことができます。 –

関連する問題