我正在像这样手动创建 EntityManager 实例(不使用
@PersistenceContext
注释)
private static final EntityManagerFactory entityManagerFactory = (EntityManagerFactory) ApplicationContextHolder.getContext().getBean("projEntityManagerFactory");
private Boolean update(String par) {
EntityManager entityManager = SharedEntityManagerCreator.createSharedEntityManager(entityManagerFactory);
StoredProcedureQuery query = entityManager.createStoredProcedureQuery(Constants.UPDATE_PROCEDURE);
//other update query builder code
return (Boolean) query.getOutputParameterValue(4);
}
我收到与资源泄漏相关的警告。我认为这可能是因为
entityManager
已被使用但从未关闭。
我尝试过的:
我在方法顶部添加了
@Transactional
注释,以便将查询绑定在事务中,并在事务结束时关闭资源。
我读了这个document,它指出我应该使用
EntityTransaction
并关闭与entityManager.close()
的连接
哪一个是正确的?如何解决资源泄漏警告?
仅通过查看代码很难预测,但为了在事务完成后返回DB连接,必须将JPA open-in-view (OSIV)更改为false。而且我认为第二种方法,直接关闭实体管理器,适合你的情况。不过,一般来说,将实体管理器注册为Spring bean并通过DI使用它会更有效地管理资源。如果您自己创建并使用,请务必归还资源。