この質問を許してください、しかし私は今のところ私の研究を通して解決策を見つけることができません。(少なくとも私を助けたものは何もありません)
私の状況:
- vaadinWebサービスにHibernateを使用しています
- Webサービスはアップロードされたドキュメントを取得し、MySQLデータベースの休止状態を介して変更せずに配置します
- バックグラウンドのコンピューティングサービス(後で別のサーバー上にある可能性のある別のプロセス)は、アップロードされたドキュメントに対して計算タスクを実行し、結果をデータベースに再度追加します
- Webサービスはデータベース内の分析結果を認識し、ユーザーに表示します
私の問題:
- 私の問題はレベル1の休止状態のキャッシュです
- 計算サービスが開始された後、指定された検索クエリを実行したときにキャッシュに表示されないため、後で更新されたドキュメントについては何も計算しません。
- 私のWebサービスは、計算サーバーに加えられた変更を上書きします。これは、Webサービスについても何も知らないためです。
Hibernateレベル1キャッシュがこの動作の原因であることを知っています(ちなみに、lvl 2キャッシュはアクティブではありません)。
私がこれまでに試したこと
私はたくさん読んで、いくつかのことを試しました。たとえば、さまざまな場所でsession.clear()を呼び出します。これはしばしば「セッションが閉じられた」という例外を私に与え、私を助けませんでした(これが彼らの問題を助けたと言っている人々について読んだのですが)
最後にセッションが常に閉じられるようにしようとしましたが、これで問題が解決しなかっただけでなく、transaction.commit()を使用した後、セッションを手動で閉じる必要がないことを読みました(Iこれはリクエストパターンごとのセッションの標準であると聞きました)
コンピューティングサービスがデータベースを検索する必要があるたびに、セッションファクトリを閉じて再度開いてみました。これは部分的に機能し、Webサービスでもこれを実行するとおそらく完全に機能しますが、これは私にとってあまり良い解決策ではないようです(メモリを消費しますが、そうではありませんか?)
追加してみました
<property name = "hibernate.connection.isolation"> 2 </ property>
私のhibernate.cfg.xmlに追加しましたが、これも部分的にしか機能しませんでした。これを使用して、私の計算サービスは計算タスクを実行しましたが、新しいデータがWebサービスを介してアップロードされるたびに、彼の変更は再び上書きされました。そのため、新しいアップロードが検出されましたが、新しいアップロードが到着すると、すでに分析されたすべてのドキュメントが再度分析されます。
- 「setForceCacheRefresh(booleanforceCacheRefresh)」というQueryメソッドについて読みました(例:ここからhttp://www.dil.univ-mrs.fr/~massat/docs/hibernate-2/api/net/sf/hibernate/Query .html#setForceCacheRefresh%28boolean%29)、しかしどういうわけか私は休止状態のバージョンでこのメソッドを見つけることができません。悲しいけど、説明は良さそうだった
セッションの管理方法が間違っているかどうかを常に考えていました。私のクラスDAOには2つのメソッドがあり、トランザクションのすべての開始時とすべての終了時に呼び出されます。
public abstract class DAO {
/**
* Returns the current hibernate session. Also takes care that there's
* always an open hibernate transaction when needed.
*
* @return Current hibernate session
*/
public static Session getSession() {
Session currentSession = HibernateUtil.getSessionFactory()
.getCurrentSession();
if (!currentSession.getTransaction().isActive()) {
currentSession.beginTransaction();
}
return currentSession;
}
/**
* Closes the current hibernate session, if there is one.
*/
public static void closeSession() {
Session sess = HibernateUtil.getSessionFactory().getCurrentSession();
if (sess.getTransaction().isActive()) {
sess.getTransaction().commit();
}
ThreadLocalSessionContext.unbind(HibernateUtil.getSessionFactory());
}
}
Hibernateを使用したオプティミスティックロックについても読んだことがありますが、これで問題が解決するかどうかはわかりません。オプティミスティックロックは、キャッシュオブジェクトがデータベース内にない場合にのみ例外をスローすることを読みました。しかし、それはキャッシュをロード(更新)しますか?
休止状態でこの問題をどのように処理しましたか?私にできることや、DAOクラスで何か間違ったことをしたことについて何か提案はありますか?コード例にも満足しています。繰り返しますが、すべてのプロセスが、他のプロセスによってデータベースに加えられた変更について認識している必要があります。(可能であれば、最初のキャッシュを無効にすることもできますが、これは不可能なので)
すべての回答に感謝し、あなたが私と共有していると思いました