web-dev-qa-db-ja.com

Hibernateがデータベースを読み取り、キャッシュされたエンティティを返さないようにする

WebアプリケーションにHibernateとSpringを使用しています。

データベース操作では、Hibernateはエンティティをキャッシュし、実際のデータベースを読み取らずに次のリクエストでエンティティを返します。これにより、データベースの負荷が軽減され、パフォーマンスが向上することがわかっています。

しかし、このアプリはまだ作成中ですが、リクエストごとにデータベースからデータをロードする必要があります(テストの理由)。

データベースの読み取りを強制する方法はありますか?

このlog4jメッセージからキャッシュについて確信しました。

Returning cached instance of singleton bean 'HelloController'
DEBUG [http-bio-8080-exec-42] - Last-Modified value for [/myApp/../somePageId.html] is: -1
18
Saif

session.refresh(entity)またはentityManager.refresh(entity)(JPAを使用する場合)は、DBからの新しいデータを提供します。

17
Predrag Maric

新しいトランザクション内で読み取りを実行します。

例えば:

...
MyDTO myDTO = fetchMyDTOById(daoId);
...
@Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
private MyDTO fetchMyDTOById(Long dtoId) {
    return repository.findById(dtoId);
}
11
wild_nothing
  • エンティティの更新session.refresh(entity)を呼び出します

    または

  • 新しいセッションを開き、session2.get(EntityClass.class,id)を呼び出します。データベースからエンティティを取得します

        Session session2=sessionFactory.openSession();                  
        EntityClass entity=(EntityClass) session2.get(EntityClass.class, id);
    
4
Hatem Badawi

@EnableCachingアノテーションを構成クラスから使用して、キャッシュを無効にしますが、他のキャッシュアノテーションはまだ存在します。また、キャッシュを有効にする場合はいつでもコメントを解除できます。

0