@Transactional
public MyEntity getEntity(long id) {
return dao.findOne(id);
//or select and update as well
}
トランザクションメソッドを呼び出すたびに:休止状態からキャッシュされたエンティティを取得しますか(初回を除く)?または、常に新しいエンティティをDBからフェッチしますか?
同じDBを共有する2つの独立したアプリがあるため、これは重要です。別のアプリがバックグラウンドでDB内の同じエンティティを既に更新している場合でも、hibernateがキャッシュされたエンティティを返さないようにする必要があります。
これがサービスレイヤーのトランザクション境界である場合、Hibernateは新しいセッションを作成します。つまり、第1レベルのキャッシュには何もありません。findOne
同じサービスメソッド内でメソッドを2回呼び出そうとすると、2回目の呼び出しでキャッシュからエンティティがフェッチされます。
連続するサービスメソッド呼び出し(getEntityなど)は常に新しいHibernateセッションで終了するため、データベースから新しいエンティティがロードされます。
第2レベルのキャッシュを使用し、このエンティティに対してアクティブ化すると、Hibernateは常に最初にキャッシュにヒットし、キャッシュミス時にデータベースのロードにフォールバックします。
データ整合性の異常を防ぐために、とにかく楽観的ロックの使用を検討してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加