1

私は奇妙なシナリオを得ています.2つの別々のJVMプロセスによって実行されている2つの休止状態のインスタンス(たとえば、AとB)があります.理由は聞かないでください. A がコミット (trans.commit()) して MySql のテーブル T に書き込むと、B が T から同じレコードを読み取ると、古いデータが取得されます。

A と B にはそれぞれ、sessionA と sessionB という単一のセッション オブジェクトがあります。そのため、新しい openSession() は呼び出されていません。

なぜこれが起こっているのか、誰かが私に手がかりを提供してもらえますか?

4

3 に答える 3

2

MySQL でデータベースを作成するために使用しているデータベース エンジン。データベース エンジンとしてInnoDBを使用している場合は、 MyISAMに変更します。これは、hibernate SessionFactory の複数のインスタンスを作成する際の最も一般的な問題の 1 つです。セカンド レベル キャッシングを使用している場合、これは問題であると思われるかもしれませんが、そうではありません。したがって、データベース エンジンを変更すると、問題の解決に確実に役立ちます。

うまくいったかどうか教えてください。これがうまくいかない場合は、他の解決策を提供します。

于 2013-02-18T07:29:32.190 に答える
2

トランザクション境界とキャッシュ設定に関する詳細情報が必要です。キャッシュの問題かどうかを判断するには、インスタンス B がインスタンス A が書き込んだデータを読み取る直前に、次のコードを実行します。

    session.getSessionFactory().getCache().evictCollectionRegions();
    session.getSessionFactory().getCache().evictDefaultQueryRegion();
    session.getSessionFactory().getCache().evictEntityRegions();
    session.getSessionFactory().getCache().evictQueryRegions();

これにより、構成されたすべてのキャッシュが削除されます。その後、B の読み取りが機能する場合は、インスタンス間にキャッシュの問題があります (可能性があります)。B の読み取りがまだ機能しない場合は、ターミナル経由で DB をチェックして、A のデータがコミットされていることを確認します。

于 2013-02-16T05:59:27.763 に答える
2

他の代替案について: Hibernate を ORM (Object Relational Mapping) Tool として使用している場合は、休止状態のドキュメントでLockOptionsを確認できます。挿入され、データベースから取得されるエンティティでLockMode.Upgradeを使用できます。

概要 : hibernate でLockOptionsを確認し、そのような状況でLockMode Upgradeを適用します。

それでも問題が発生した場合は、それを投稿してください。問題の解決策が提供されることを願っています。

ありがとう。

于 2013-02-25T14:05:46.160 に答える