在我们的项目中,我们使用Spring和Spring Data(用于服务器端API服务),但有时我们不使用Spring Data查询,而是使用JPA标准。为此,我们使用:
@PersistenceContext
private EntityManager em;
...
CriteriaBuilder cb = em.getCriteriaBuilder();
...
来自Spring
文档:
虽然EntityManagerFactory实例是线程安全的,但EntityManager实例却不是。注入的JPA EntityManager的行为类似于从应用程序服务器的JNDI环境获取的EntityManager,如JPA规范所定义。它将所有调用委托给当前的事务性EntityManager,如果有的话;否则,它会回退到每个操作新创建的EntityManager,实际上使其使用线程安全。
所以我们使用的方式似乎应该是当前会话(如果存在),如果不存在则应该创建新会话。我们面临的问题是这种用途的内存泄漏。似乎这种方式打开了很多Hibernate会话,并没有关闭它们。
对于这个问题:使用Hibernate在Spring中使用当前/打开新会话的最佳做法是什么?
注意:HibernateUtil
没有其他帖子中建议的getSessionFactory()
谢谢,
阿龙