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()
。这也有效,但会偏离现有设计。
我的应用程序有一项服务将在内部轮询作业输出。它轮询直到作业状态从 "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()
。这也有效,但会偏离现有设计。