2012-03-31 20 views
0

ロードバランシングのために複数のTomcatインスタンス上で実行する必要があるhibernateを使用するWebアプリケーションがあります。各要求は、それ自身の休止状態のセッションとトランザクションを取得します。トランザクションは要求の開始時に開始され、終了時にコミットまたはロールバックされます(スローされた例外に応じて)。複数のサーバでHibernateとTomcatを同時に使用してアクセスする

レコードが既に存在するかどうか(プライマリフィールドではないフィールドによって異なります)をチェックし、そうでない場合にのみ挿入する必要があります(私は使用したくないデータベースに依存しないようにする)。これを解決するにはselectを行い、結果がない場合は挿入します。同時リクエストを処理するために、私は同期ブロックを使用しました。これは、すべての要求が、同時要求が行った変更を「見る」ことができない独自のトランザクションで実行されるため、機能しませんでした。この問題を取り除くために、私は手動でコミットし、同期ブロック内で新しいトランザクションを開始して現在のデータベース状態を取得しました。

これはアプリケーションが1台のサーバー上で実行されている限り、これはうまくいきました。複数のインスタンスでコードを同期できないため、複数のインスタンスで実行されるとすぐには動作しなくなります。

この問題(または複数インスタンスの問題)は、どのように優れたプラクティスコードで解決されるはずですか?

ありがとうございます!

答えて

0

この質問には良い答えはありません。一般的には不可能です。 .....

データベースが同期ポイントの1つのみである場合は、挿入時にビジネスキーチェックでSQL挿入を実行してください。

それは次のようになりますMYTABLE(COL1、COL2)SELECT MYVAL1、このケイ適切なデータベース・トランザクション分離レベルで

を設定しなければならない(DUALまたは他のSYSTABLE)FROM MYVAL2に INSERT。

+0

ご回答ありがとうございます。私はいくつかの問題をさらに研究し、1つのリクエスト(トランザクション)のためにテーブル全体をロックすることが可能であると考えていたので、他のすべてのリクエストはこのリクエストが完了するのを待たなければなりません。私はSession.lock、Session.buildLockRequestとCriteria.setLockModeを試しましたが、テーブル全体をロックするのに成功しませんでした。それは可能なのでしょうか、どのようにそれを行うことができますか? – Werzi2001

関連する問題