为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

德玛西亚99 2021-11-11 13:17:01
我在一个大循环中检索一个 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);}
查看完整描述

1 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

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

避免会话建立的最明显选项是开始一个新会话,但这并不总是可行的,例如由于事务范围。

单个会话中的最佳解决方案是session.clear(),这将丢弃会话已建立的任何实体实例。如果循环中还发生了更新,则您需要session.flush()clear(),之前执行 a以将到目前为止的任何更改推送到数据库。

至少在纯 Hibernate(非 JPA)环境中,另一个选项是StatelessSession,它没有StatefulPersistenceContext,因此不会建立。我已经尝试过几次,但犹豫要不要推荐它 - 它似乎没有被广泛使用,因此很难在线排除故障。


查看完整回答
反对 回复 2021-11-11
  • 1 回答
  • 0 关注
  • 264 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信