猿问

每次我从 Hibernate 检索实体然后丢弃时,Hibernate 是否会挂在任何资源上

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


所以我一次只使用一个SongDiff实体,所以我的问题是 Hibernate 会释放这样的资源,比如循环,或者它可以挂在它上面,我是否需要session.flush()偶尔调用或者这没有什么区别?


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


我问是因为在代码的这个区域中有OutOfMemory错误的代码,我想知道这是否可能是问题所在。


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

}


德玛西亚99
浏览 265回答 1
1回答

30秒到达战场

默认情况下,如您所说,Hibernate 将构建实体实例 - 在其StatefulPersistenceContext. 它这样做是为了使其能够在再次获取实例时匹配该实例,并跟踪为下一次提交或刷新做好准备的更新。避免会话建立的最明显选项是开始一个新会话,但这并不总是可行的,例如由于事务范围。单个会话中的最佳解决方案是session.clear(),这将丢弃会话已建立的任何实体实例。如果循环中还发生了更新,则您需要session.flush()在clear(),之前执行 a以将到目前为止的任何更改推送到数据库。至少在纯 Hibernate(非 JPA)环境中,另一个选项是StatelessSession,它没有StatefulPersistenceContext,因此不会建立。我已经尝试过几次,但犹豫要不要推荐它 - 它似乎没有被广泛使用,因此很难在线排除故障。
随时随地看视频慕课网APP

相关分类

Java
我要回答