我在一个大循环中检索一个 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
,因此不会建立。我已经尝试过几次,但犹豫要不要推荐它 - 它似乎没有被广泛使用,因此很难在线排除故障。
添加回答
举报
0/150
提交
取消