我的应用程序有一个服务将在内部轮询作业输出。它会轮询,直到作业状态从“正在进行”变为“已完成”。另一个系统将在处理作业后将作业状态更新为“已完成”。
这里的问题是,第一次从DB轮询作业状态时状态为“正在进行中”。但是后来即使通过其他流程改变了工作状态,我仍然将其视为“正在进行中”。问题不在于DB隔离级别(可重复读取),因为我的hibernate查询正在执行事务。我怀疑结果是缓存的,当在同一个会话中执行相同的查询时,我得到了缓存的结果。
如果多次在同一会话中执行相同的查询,如何从DB获取更新的数据。
此致 Chandu
答案 0 :(得分:2)
<强>更新强>
根据评论,它是一个使用Spring JPA数据的Spring Boot应用程序。并且positions = positions + 1
类每5分钟检查一次状态,并在其中有一个循环。即,实际上是在同一交易中,即同一会话。
因此,除非我们致电service
或refresh()
,否则我们将无法从数据库中看到更新后的状态。
但问题是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
。这也有效,但与现有设计有所不同。