Hiberanate禁用缓存结果

时间:2016-03-30 15:31:24

标签: hibernate jpa spring-boot hibernate-cache

我的应用程序有一个服务将在内部轮询作业输出。它会轮询,直到作业状态从“正在进行”变为“已完成”。另一个系统将在处理作业后将作业状态更新为“已完成”。

这里的问题是,第一次从DB轮询作业状态时状态为“正在进行中”。但是后来即使通过其他流程改变了工作状态,我仍然将其视为“正在进行中”。问题不在于DB隔离级别(可重复读取),因为我的hibernate查询正在执行事务。我怀疑结果是缓存的,当在同一个会话中执行相同的查询时,我得到了缓存的结果。

如果多次在同一会话中执行相同的查询,如何从DB获取更新的数据。

此致 Chandu

1 个答案:

答案 0 :(得分:2)

<强>更新

根据评论,它是一个使用Spring JPA数据的Spring Boot应用程序。并且positions = positions + 1类每5分钟检查一次状态,并在其中有一个循环。即,实际上是在同一交易中,即同一会话。

因此,除非我们致电servicerefresh(),否则我们将无法从数据库中看到更新后的状态。

但问题是evict() and reload没有公开任何我们可以在CrudRepository上调用refresh()的方法。

因此选项是entity manager并添加一个方法CrudRepository。此方法将在内部调用refreshEntity(...)。最后,entityManager.refresh()循环可以调用此service方法并获取更新的数据。

举个例子:

refreshEntity(..)

有关Extending repository的更多信息,请访问以上链接。

其他选项是,而不是扩展public interface MyStatusRepository { void refreshEntity(StatusEntity se); } public interface StatusRepository extends CrudRepository<StatusEntity, Long>, MyStatusRepository { ... } @Repository public class MyStatusRepositoryImpl implements MyStatusRepository { @PersistenceContext private EntityManager entityManager; @Override public void refreshEntity(StatusEntity se); { entityManager.refresh(se); } ... } ,在CrudRepository类本身自动装配entityManager并在其上调用service。这也有效,但与现有设计有所不同。