spring 当使用SharedObjectManagerCreator创建时,ObjectManager会导致资源泄漏

cs7cruho  于 2024-01-05  发布在  Spring
关注(0)|答案(1)|浏览(100)

我正在像这样手动创建一个类似于@PersistenceContext的示例(不使用@PersistenceContext注解)

  1. private static final EntityManagerFactory entityManagerFactory = (EntityManagerFactory) ApplicationContextHolder.getContext().getBean("projEntityManagerFactory");
  2. private Boolean update(String par) {
  3. EntityManager entityManager = SharedEntityManagerCreator.createSharedEntityManager(entityManagerFactory);
  4. StoredProcedureQuery query = entityManager.createStoredProcedureQuery(Constants.UPDATE_PROCEDURE);
  5. //other update query builder code
  6. return (Boolean) query.getOutputParameterValue(4);
  7. }

字符串
我收到有关资源泄漏的警告。我假设这可能是因为entityManager被使用但从未关闭。
我所尝试的:
1.我在我的方法上添加了@Transactional注解,这样查询就被绑定到事务中,并且当事务结束时资源也被关闭。
1.我读了这个document,它指出我应该使用EntityTransaction并关闭与entityManager.close()的连接
哪一个是正确的?我如何解决资源泄漏警告?

vshtjzan

vshtjzan1#

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

相关问题