Hibernate 禁用缓存结果

Hiberanate disable cached results

我的应用程序有一项服务将在内部轮询作业输出。它轮询直到作业状态从 "In-progress" 变为 "Completed"。另一个系统将在处理作业后将作业状态更新为 "Completed"。

这里的问题是,第一次从数据库中轮询作业状态时,状态为 "In-progress"。但后来即使其他进程更改了作业状态,我仍然将其视为 "In-progress"。问题不在于数据库隔离级别(可重复读取),因为我的休眠查询是在事务外执行的。我怀疑结果被缓存了,当在同一个会话中执行相同的查询时,我得到了缓存的结果。

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

此致, 禅都

更新

根据评论,它是一个使用 Spring JPA 数据的 Spring 启动应用程序。 service class 每 5 分钟检查一次状态,其中有一个循环。即,这实际上在同一个事务中,即同一个会话。

因此,除非我们调用 refresh()evict() and reload,否则我们将无法从数据库中看到更新后的状态。

但问题是 CrudRepository 没有公开任何我们可以在 entity manager.

上调用的方法,例如 refresh()

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

举个例子:

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);
    }
    ...
}

更多关于Extending repository的信息可以在上面link找到。

另一个选项是,不是扩展 CrudRepository,而是在 service class 本身中自动装配 entityManager 并在其上调用 refresh()。这也有效,但会偏离现有设计。