【问题标题】:How to release multiple org.hibernate.impl.SessionFactoryImpl如何释放多个 org.hibernate.impl.SessionFactoryImpl
【发布时间】:2011-07-19 07:27:06
【问题描述】:

继续解决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.
...

详情:

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) {...}
   }  
 }

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

【问题讨论】:

    标签: java hibernate memory-leaks garbage-collection


    【解决方案1】:

    如果你能创建一个类 HibernateSession 来处理打开、关闭和回滚事务会更好。

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

    【讨论】:

    • 谢谢你,Mi Mee,你的建议让我走上了正确的道路,我已经减少了 DaoSF 并重写了 DaoCrud,问题就解决了。所以我接受你的回答。谢谢:)
    【解决方案2】:

    每次需要会话时,您都在创建和初始化一个新的 SessionFactory。您的 getSessionFactory 方法应该检查您是否已经拥有一个,而不是总是创建一个新的。

    【讨论】:

    • 谢谢你,Thomas,我去看看 :)
    【解决方案3】:

    首先你应该在 finally 语句中关闭连接和会话。也许有一些例外并且会话没有关闭?其次,hibernate 存在与没有关闭会话相关的错误。看这个帖子:OutofMemory: SessionImpl cached even after close and flush?

    【讨论】:

    • 谢谢,zacheusz,但会话似乎已关闭,每次访问数据库都会使 sessionFactory 保持活动状态..:/
    • 所以看看我在 Hibernate 论坛上的主题链接,正如我在你的另一个问题中所说的,恕我直言,这可能不是真正的内存泄漏
    • 最后,这不是休眠问题,而只是我的问题。这是我对会话工厂的误解,我已经减少了 DaoSF 并重写了 DaoCrud,它现在可以正常工作了......无论如何,谢谢你:)
    • 所以这不是内存泄漏,而是广泛的内存使用:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    相关资源
    最近更新 更多