EntityManager 在使用 SharedEntityManagerCreator 创建时导致资源泄漏

问题描述 投票:0回答:1

我正在像这样手动创建 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
已被使用但从未关闭。

我尝试过的:

  1. 我在方法顶部添加了

    @Transactional
    注释,以便将查询绑定在事务中,并在事务结束时关闭资源。

  2. 我读了这个document,它指出我应该使用

    EntityTransaction
    并关闭与
    entityManager.close()

    的连接

哪一个是正确的?如何解决资源泄漏警告?

java spring spring-data-jpa entitymanager
1个回答
0
投票

仅通过查看代码很难预测,但为了在事务完成后返回DB连接,必须将JPA open-in-view (OSIV)更改为false。而且我认为第二种方法,直接关闭实体管理器,适合你的情况。不过,一般来说,将实体管理器注册为Spring bean并通过DI使用它会更有效地管理资源。如果您自己创建并使用,请务必归还资源。

© www.soinside.com 2019 - 2024. All rights reserved.