代码之家  ›  专栏  ›  技术社区  ›  Paul Taylor

每次我从HIbernate检索一个实体,然后丢弃它时,HIbernate是否会挂起任何资源

  •  1
  • Paul Taylor  · 技术社区  · 6 年前

    我在一个大循环中检索一个SongDiff Hibernate实体,处理它,然后得到下一个实体。

    所以我只用一个 SongDiff 所以我的问题是Hibernate是否会释放循环中的资源,或者它是否会挂起它,我需要调用它 session.flush() 偶尔还是没什么区别?

    我只是从Hibernate检索数据,没有修改任何数据

    内存不足

    try
    {
        session = com.jthink.songlayer.hibernate.HibernateUtil.getSession();
    
        for(Integer recNo:recNos)
        {
            count++;
    
            //Get Metadata changes
            SongDiff                songDiff    = SongChangesCache.getSongDiffFromDatabase(session, recNo);
            MetadataAllChanges      mas         = (MetadataAllChanges) SerializationHelper.deserialize(songDiff.getDiff());
            sr.writeDatatoXlsFile(recNo, mas);
        }
    }
    finally
    {
        HibernateUtil.closeSession(session);
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   df778899    6 年前

    默认情况下,正如您所说,Hibernate将在其 StatefulPersistenceContext . 它这样做是为了使它能够在再次获取实例时匹配实例,并跟踪为下一次提交或刷新准备的更新。

    避免会话累积的最明显的选择是启动一个新会话,但这并不总是可行的,例如由于事务范围的原因。

    单个会话中的最佳解决方案是 session.clear() session.flush() clear() ,将迄今为止的任何更改推送到数据库。

    另一个选项,至少在纯Hibernate(非JPA)环境中是 StatelessSession ,它没有 状态持久上下文