2016-08-21 88 views
0

我重複調用這段代碼片段,並且每次調用內存需求都會不斷增加。休眠內存泄漏

如何在每次調用時釋放內存?

 final Session session = Hibernate.getSessionFactory().openSession(); 
 
     try { 
 
      Transaction tx = session.getTransaction(); 
 
      tx.begin(); 
 
      final ProjectionList projList = Projections.projectionList(); 
 
      projList.add(Projections.count("totalLinePrice")); 
 
      projList.add(Projections.sum("totalLinePrice")); 
 
      final Object[] sum = (Object[]) session 
 
        .createCriteria(OrderR.class) 
 
        .setProjection(projList) 
 
        .add(Restrictions.eq("shopId", getShopR().getId())) 
 
        .add(Restrictions.gt("dtime", ord.monthBackTime)) 
 
        .uniqueResult(); 
 
      ord.num = (int) sum[0]; 
 
      ord.revenueTotal = (long) sum[1]; 
 
      tx.commit(); 
 
     } catch (HibernateException e) { 
 
      throw new Bug(e); 
 
     } finally { 
 
      session.flush(); 
 
      session.clear(); 
 
      session.close(); 
 
     }

回答

0

嘗試使用EntityManager來代替。您可以使用entitymanager.unwrap()檢索底層的Hibernatesession。

1

如果你在使用eclipse,使用'Eclipse Memory Analyzer'可以幫助提供java堆使用的細節。希望Hibernate.getSessionFactory()遵守單例模式,因爲hibernate sessionFactory的內部狀態是不可變的。

讓我知道它是否有幫助!