强制休眠读取数据库且不返回缓存的实体

eni9jsuy  于 2022-10-23  发布在  Spring
关注(0)|答案(5)|浏览(327)

我正在为我的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
kadbb459

kadbb4591#

session.refresh(entity)entityManager.refresh(entity)(如果您使用JPA)将为您提供来自数据库的新数据。

lnlaulya

lnlaulya2#

在新事务内执行读取。
例如:

...
MyDTO myDTO = fetchMyDTOById(daoId);
...
@Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
private MyDTO fetchMyDTOById(Long dtoId) {
    return repository.findById(dtoId);
}
kkbh8khc

kkbh8khc3#

  • 调用刷新实体session.refresh(entity)

或者

  • 打开新会话,然后调用session2.get(EntityClass.class,id),它将从数据库中拉出实体
Session session2=sessionFactory.openSession();                  
    EntityClass entity=(EntityClass) session2.get(EntityClass.class, id);
4bbkushb

4bbkushb4#

请调用EntityManger.lear()方法,然后根据需要调用repository.findOne()或repository.findOne()从数据库中选择更新的数据。

@PersistentContext EntityManager em;
@Autowired EntityReporisitory rep;
....
....
@Transactional
public void method(){
....
....
em.clear();// This line will clear the current value of entity
Entity e = rep.find(example);// In this line data will be loaded freshly from DB
....
....
}
ecfsfe2w

ecfsfe2w5#

您可以使用计数器来确保缓存未命中。“计数器”可以是任何唯一的值生成器,例如文字计数器、时间参数甚至UUID。预计负条件为真。
例如:

@Query("select p from Post p where p.id = :postId and p.postedOn <> :cacheBustingTimer")
Post fetchPostById(@Param("postId") Long postId, @Param("cacheBustingTimer") LocalDateTime cacheBustingTimer);

呼叫示例

Post post = postRepository.fetchPostById(postIdToFetch, LocalDateTime.now().minusYear(100));

相关问题