我正在使用本地线程来管理我的休眠会话。最近,我在生产服务器上看到了 OutOfMemory 异常。我在 heap_dump 上运行了 Eclipse MAT,发现我的很多会话没有被垃圾收集,即使它们由于被 tomcatse ThreadWithAttributes 对象引用而被关闭。现在这让我发疯了,我在不同的论坛上看到了很多类似问题但没有答案的帖子。任何帮助将不胜感激。
谢谢
我正在使用本地线程来管理我的休眠会话。最近,我在生产服务器上看到了 OutOfMemory 异常。我在 heap_dump 上运行了 Eclipse MAT,发现我的很多会话没有被垃圾收集,即使它们由于被 tomcatse ThreadWithAttributes 对象引用而被关闭。现在这让我发疯了,我在不同的论坛上看到了很多类似问题但没有答案的帖子。任何帮助将不胜感激。
谢谢
如果您在 Web 应用程序中使用 Hibernate Sessions,请不要让 ThreadLocal 中的 Session 对象在请求之间留在那里 - 因为无论如何您都无法控制线程,它们属于容器。
如果您需要在 Web 请求的整个生命周期内创建和关闭 Session,并且您不希望到处传递 Session 对象,则应该考虑编写一个 ServletFilter 来处理清理 - 它将在每个请求周围被调用。您还可以让该过滤器提交或回滚您可能已经启动的任何事务。
您应该阅读此页面以了解如何操作的简单方法:http: //community.jboss.org/wiki/OpenSessioninView
感谢您的回复。我目前在视图中使用打开会话,使用 getCurrentSession(),这意味着会话是每个请求都可以在 transaction.commit() 上关闭。我可以看到会话正在关闭(尽管没有取消),但 ThreadWithAttributes tomcat 类以某种方式持有对 sessionImpl 的引用,以防止它被垃圾收集。每个线程都会发生这种情况。我的数据库非常大,因此这会导致最多几个小时或一天后出现内存不足错误,并且需要退回服务器。