java - 如何释放多个 org.hibernate.impl.SessionFactoryImpl

标签 java hibernate memory-leaks garbage-collection

继续求解this problem ,我使用 MAT 发现了几个“org.hibernate.impl.SessionFactoryImpl”内存泄漏:

54 instances of "org.hibernate.impl.SessionFactoryImpl", loaded by "org.apache.catalina.loader.WebappClassLoader @ 0xbb00fb0" occupy 33 962 536 (64,40%) bytes. 

Biggest instances:

org.hibernate.impl.SessionFactoryImpl @ 0x3f026c0 - 652 664 (1,24%) bytes. 
org.hibernate.impl.SessionFactoryImpl @ 0x49018f8 - 652 664 (1,24%) bytes. 
org.hibernate.impl.SessionFactoryImpl @ 0x7b0e2b8 - 652 664 (1,24%) bytes. 
org.hibernate.impl.SessionFactoryImpl @ 0x7d65e60 - 652 664 (1,24%) bytes.
...

详细信息: enter image description here

DaoSF.java

public final class DaoSF implements Serializable
{
  private static final long serialVersionUID = 1L;
  private static SessionFactory sessionFactory;
  private static Session hibSession;

  private synchronized static void initSessionFactory() {
    Configuration config = new Configuration();
    config.configure("hibernate.cfg.xml"); 
    sessionFactory = config.buildSessionFactory();
    hibSession = sessionFactory.getCurrentSession();
  }

  public static SessionFactory getSessionFactory() {
    initSessionFactory();
    return sessionFactory;
  }

  public static Session getSession(){ 
    return hibSession;
  }
}

DaoCrud.java 的一部分:

  public void save(Object dataItem) throws Exception 
  { 
    session = DaoSF.getSessionFactory().openSession();

    Transaction tx = session.beginTransaction();  
    session.save(dataItem);  
    session.flush();
    tx.commit();  

    if (session != null) session.close();
  }

Bean.java的一部分

 public void save() {
   try {
     mydao.save(item);
   }
   catch (Exception e) {...}
   }  
 }

我做错了什么?如何正确使用 session 工厂?你能帮帮我吗?

最佳答案

如果您可以创建一个 HibernateSession 类来处理打开、关闭和回滚事务,那就更好了。

您应该将 session.close() 放在 finally 语句中,然后将 null 分配给 session 和 transaction 以确保它们将被垃圾收集。

关于java - 如何释放多个 org.hibernate.impl.SessionFactoryImpl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6743626/

相关文章:

java - 从属性文件加载颜色

java - Spring 启动+ hibernate : Duplicate entry Exception while save entity

java - Hibernate:防止更新 session 中从未手动更新的脏实例

ios - 如何解决pushViewController 周围的内存泄漏问题?

android - LeakCanary 与 Cordova 的依赖关系 - 找不到方法 debugCompile()

JavaScript:2011 年我应该担心内存泄漏吗?

java - 如何在 Ant 中使用并行任务

java - 为什么 test1() 比 test2() 运行得快得多?

java - Travis CI 构建失败

java - 类加载器设置不适用于 Websphere 8