我面临的问题类似于Invalidating JPA EntityManager session中描述的问题:
问题:获取过时的数据
我们正在 SQL 数据库上运行 JPQL 查询,该数据库也由不同的应用程序同时更改。我们使用的是在 Tomcat 下运行的 JSF+Spring+EclipseLink。
执行 JPQL 查询的类是一个单例 Spring bean,并使用注入的EntityManager
:
@Component
public class DataRepository{
@PersistenceContext
private EntityManager entityManager;
public List<MyDTO> getStuff(long id) {
String jpqlQuery ="SELECT new MyDTO([...])";
TypedQuery<MyDTO> query = entityManager.createQuery(jpqlQuery,MyDTO.class);
return query.getResultList();
}
[...]
(代码释义)。
问题是这段代码看不到直接在数据库上执行的更改。这些更改仅在 Tomcat 实例重新启动时才可见。
我们尝试过的
我们假设此行为是由与 关联的一级缓存引起的EntityManager
,如链接问题中所述。我们找到了两个解决方案:
- 在调用
entityManager.clear()
之前调用createQuery
(在链接的问题中建议) - 注入一个
EntityManagerFactor
(使用),然后为每个查询@PersistenceUnit
创建并关闭一个新的EntityManager
两种解决方案都能满足我们的需求——我们获得了新数据。
问题:
- 这两种解决方案是否正确?哪一个更好?
- 特别是,我们可以安全地调用
entityManager.clear()
注入的 EntityManager,或者这会以某种方式影响也使用注入的 EntityManager 的其他代码(在相同或不同的类中)? - 有不同的更好的方法吗?我们可以以某种方式声明我们想要刷新缓存,或者我们想要一个新的缓存
EntityManager
吗?
我认为这一定是一个相当普遍的问题(每当多个应用程序共享一个数据库时就会发生这种情况),所以我认为必须有一个简单的解决方案......