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
session.refresh(entity)
またはentityManager.refresh(entity)
(JPAを使用する場合)は、DBからの新しいデータを提供します。
新しいトランザクション内で読み取りを実行します。
例えば:
...
MyDTO myDTO = fetchMyDTOById(daoId);
...
@Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
private MyDTO fetchMyDTOById(Long dtoId) {
return repository.findById(dtoId);
}
エンティティの更新session.refresh(entity)
を呼び出します
新しいセッションを開き、session2.get(EntityClass.class,id)
を呼び出します。データベースからエンティティを取得します
Session session2=sessionFactory.openSession();
EntityClass entity=(EntityClass) session2.get(EntityClass.class, id);
@EnableCaching
アノテーションを構成クラスから使用して、キャッシュを無効にしますが、他のキャッシュアノテーションはまだ存在します。また、キャッシュを有効にする場合はいつでもコメントを解除できます。