加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

database – 使用JPA时,避免来自DB的陈旧数据?

发布时间:2020-12-15 08:49:25 所属栏目:Java 来源:网络整理
导读:我遇到的问题类似于 Invalidating JPA EntityManager session中描述的问题: 问题:获取陈旧数据 我们在SQL数据库上运行JPQL查询,该数据库也由不同的应用程序同时更改.我们正在使用在Tomcat下运行的JSF Spring EclipseLink. 执行JPQL查询的类是单例Spring be
我遇到的问题类似于 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()(在链接的问题中建议)
>注入一个EntityManagerFactor(使用@PersistenceUnit),然后为每个查询创建并关闭一个新的EntityManager

两种解决方案都能满足我们的需求 – 我们获得了新的数

问题:

>这两种解决方案是否正确?哪一个更好?
>特别是,我们可以安全地在注入的EntityManager上调用entityManager.clear(),还是会以某种方式影响同样使用注入的EntityManager的其他代码(在相同或不同的类中)?
>有更好的方法吗?我们能否以某种方式声明我们要刷新缓存,或者我们想要一个新的EntityManager?

我认为这必须是一个相当普遍的问题(因为它发生在多个应用程序共享数据库时),所以我认为必须有一个简单的解决方案……

解决方法

>创建新的EntityManagers是正确的,另一个不是(见下文).
>除了单线程系统之外,调用 EntityManager#clear()是非常危险的.

…causing all managed entities to become detached…

因此,如果一个线程与附加实体一起工作,而“你的”线程清除实体管理器则会产生严重的副作用.>嗯,很难说.如果在应用程序之外修改的实体数量很少,我将直接使用数据源和JdbcTemplate进行相应的操作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读