gpt4 book ai didi

java - 当尝试关闭已读取许多对象的只读 session 时,Hibernate 因 OutOfMemory 失败

转载 作者:行者123 更新时间:2023-12-01 12:41:03 24 4
gpt4 key购买 nike

当我提交关闭 session 时,当 recNos 数组很大(>20,000)时,此代码可能会失败并出现 OutOfMemory 异常。我只读取信息,并且一次只读取一个对象(想法是通过一次读取一个对象来减少内存负载),并且我只在循环中使用该对象进行调用,但我没有明确丢弃它。我是否做错了什么,我可以显式释放内存吗?

        try
{
session = com.jthink.songlayer.hibernate.HibernateUtil.getSession();
for (Integer next : recNos)
{
Song song = SongCache.loadSongFromDatabase(session, next);
folderToSongIds.put(new File(song.getFilename()).getParent(),song.getRecNo());
}
}
finally
{
HibernateUtil.closeSession(session);
}

这是堆栈跟踪

java.lang.OutOfMemoryError: GC overhead limit exceeded
at org.hibernate.internal.util.collections.IdentityMap.entryArray(IdentityMap.java:165)
at org.hibernate.internal.util.collections.IdentityMap.concurrentEntries(IdentityMap.java:76)
at org.hibernate.engine.internal.StatefulPersistenceContext.clear(StatefulPersistenceContext.java:237)
at org.hibernate.internal.SessionImpl.cleanup(SessionImpl.java:651)
at org.hibernate.internal.SessionImpl.close(SessionImpl.java:363)
at com.jthink.songlayer.hibernate.HibernateUtil.closeSession(HibernateUtil.java:94)

最佳答案

完成后,您可以通过调用 evict 将实体从 session 中分离出来:

    {
Song song = SongCache.loadSongFromDatabase(session, next);
folderToSongIds.put(new File(song.getFilename()).getParent(),song.getRecNo());
session.evict(song);
}

关于java - 当尝试关闭已读取许多对象的只读 session 时,Hibernate 因 OutOfMemory 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25095555/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com