我在 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 产生影响。