1

我在 JPA 将旧数据保存在缓存中时遇到问题,并尝试了我能找到的解决方案,但它不断弹出!

无论如何,为了提高效率,我最初重用了一个 Entity Manager 实例。当我第一次遇到所描述的问题时,我更改了代码,以便为每个事务创建一个新的实体管理器:

/** This method is called every time a transaction is made. */

public static EntityManager createFreshEntityManager() {
    try {
        return Persistence.createEntityManagerFactory(puName)
                          .createEntityManager();         
    } 
    catch (Exception e) {
        logStuff(e); 
        return null;
    }
}

但是,这并不能解决问题。

当我使用 JDBC 截断表并重置主键时,我经常注意到某些新创建的对象具有旧的变量值。我的一个怀疑是重置主键可能是罪魁祸首,但话又说回来,我已经为每个事务拥有了一个新的实体管理器,所以这根本不重要。

我非常有信心这不是我的代码的问题,因为数据库实体永远不会存储在函数范围之外的我的应用程序中,并且总是在需要时直接从数据库查询。

我还阅读了有关使用 EntityManager.clear() 的信息,但我不希望做如此残酷的事情,因为它会弄乱多线程程序。

我曾想过通过一次获取所有对象然后手动删除它们来使用 JPA 而不是 JDBC 进行 TRUNCATE,但这只是效率低下......但话又说回来,它不会成为瓶颈。不确定这是否会对使用 JDBC 产生影响。

4

1 回答 1

2

我看不出有任何理由为每笔交易创建一个新的 EntityManager。

您应该能够使用@PersistenceContext注入您的EntityManager

它可能看起来像这样:

@Stateless
class SomeSessionBean implements SomeSessionBeanLocal {

    @PersistenceContext(unitName = "somePuName")
    private EntityManager em;

    public Customer findCustomerById(Long someId) {
        return em.find(Customer.class, someId);
    }
}

使用注解进行依赖注入是 EJB 3 最棒的事情之一!


您的问题的可能来源:

如果您在 JavaEE Web 应用程序运行时修改数据库中的值,则 EJB 不太可能立即检测到这些更改。您的持久层可能正在使用缓存。

您可能希望在“外部”更改数据库后重新启动您的 webapp。

于 2012-08-31T00:04:28.823 回答