2011-07-19 60 views
3

繼續解決this problem,我已經找到了幾個 'org.hibernate.impl.SessionFactoryImpl' 內存泄漏使用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; 
    } 
} 
0 DaoCrud.java的

部分:Bean.java

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

我在做什麼錯

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(); 
    } 

一部分?如何正確使用會話工廠?你可以幫幫我嗎?

回答

7

如果您可以創建一個HibernateSession類來處理打開,關閉和回滾事務,那將會更好。

你應該把session.close()放在finally語句中,然後爲會話和事務分配null以確保它們將被垃圾收集。

+0

謝謝米米,你的建議讓我走向正確的道路,我減少了DaoSF,重新編寫了DaoCrud,問題解決了。所以我接受你的答案。謝謝:) – gaffcz

+0

很高興我能幫到:) – 2011-07-19 15:23:41

2

首先,您應該在最後的聲明中關閉連接和會話。也許有一些例外,會話沒有關閉?其次,hibernate有沒有關閉會話連接的錯誤。看看這個帖子:OutofMemory: SessionImpl cached even after close and flush?

+0

謝謝,zacheusz,但會話似乎是關閉,並且每個訪問數據庫保持一個sessionFactory活着..:/ – gaffcz

+0

所以看看我的鏈接在Hibernate論壇的線程,正如我在你的另一個問題恕我直言,它可能是不是真正的內存泄漏 – zacheusz

+1

最後,這不是冬眠問題,而只是我的問題。這是我對會話工廠的誤解,我減少了DaoSF並重寫了DaoCrud,現在它工作正常......無論如何,謝謝:) – gaffcz

3

您每次需要會話時都會創建並初始化新的SessionFactory。您的getSessionFactory方法應該檢查您是否已經有一個,而不是始終創建一個新的。

+0

謝謝托馬斯,我會檢查一下:) – gaffcz