database – 使用JPA时,避免来自DB的陈旧数据?
我遇到的问题类似于
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关联的第一级缓存引起的,如链接问题中所述.我们找到两个解决方案 >在调用createQuery之前调用entityManager.clear()(在链接的问题中建议) 两种解决方案都能满足我们的需求 – 我们获得了新的数 问题: >这两种解决方案是否正确?哪一个更好? 我认为这必须是一个相当普遍的问题(因为它发生在多个应用程序共享数据库时),所以我认为必须有一个简单的解决方案…… 解决方法
>创建新的EntityManagers是正确的,另一个不是(见下文).
>除了单线程系统之外,调用 EntityManager#clear() 是非常危险的.
因此,如果一个线程与附加实体一起工作,而“你的”线程清除实体管理器则会产生严重的副作用.>嗯,很难说.如果在应用程序之外修改的实体数量很少,我将直接使用数据源和JdbcTemplate进行相应的操作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |