2

次の関数を使用して言います。

getUnique(){
    MyObject obj = getValueFromDb();
    obj.modifyIt();
    obj.commit();
}

このメソッドが同時に呼び出されると、複数のスレッドがMyObjectの同じ値を共有しますが、各スレッドが一意の値を持つことを期待していました。

これを修正するために、スレッド同期を使用class.getInstance().myMethodCall()していくつかのプロパティの一意の値を取得しました。これで目的は解決しましたが、同時呼び出しが発生すると、関数の効率が低下します。

これを修正するためのより良い方法はありますか?(STRUTS、HIBERNATE3.0を使用)

4

3 に答える 3

4

Hibernateでは、各スレッドに独自のセッションがあり、各セッションには異なるオブジェクトのセットがあります。したがって、各スレッドには独自のMyObjectのコピーがあります。データベースは、同時変更を処理します。2つのスレッドが同じオブジェクトを同時に変更することを禁止する場合は、Hibernateのドキュメントで説明されているように、@Versionフィールドで楽観的同時実行性を使用します。

アプリがクラスター化されている場合、またはオブジェクトが別のアプリや別の方法で変更されている場合、同期は効果がないため、同期はここでは適切なツールではありません。

于 2012-01-12T11:59:35.047 に答える
1

「いくつかのスレッドがMyObjectの同じ値を共有する」というあなたの仮定は間違っています。MyObjectはインスタンス変数ではないため、他のスレッドと共有されることはありません。

于 2012-01-12T11:45:42.093 に答える
0

私はあなたに2つのことを言いたいと思います、最初は@Umeshが指摘したように、各スレッドはMyObjectの独自のコピーを持っています、彼らはコピーを共有していません

次に、関数getValueFromDb()も外部にあります。getValueFromDb()も同期されていることを確認しましたか。そうでない場合は?次に、それも同期する必要があります。

また、myMethodCall()の内部には何がありますか?getValueFromDb()が返すのと同じ値を返しますか?

于 2012-01-12T11:52:09.720 に答える