Threadlocal引用hibernate session impl,导致session impl不被垃圾收集

时间:2010-09-09 20:56:22

标签: hibernate garbage-collection thread-local

我正在使用本地线程来管理我的hibernate会话。最近我在生产服务器上看到了OutOfMemory异常。我在heap_dump上运行了Eclipse MAT,看到很多我的会话都没有收集垃圾,即使它们被tomcatse ThreadWithAttributes对象引用它们而被关闭了。这让我发疯了我现在看到很多帖子在不同的论坛上有类似的问题,但没有答案。任何帮助将不胜感激。

由于

2 个答案:

答案 0 :(得分:0)

如果您在Web应用程序中使用Hibernate会话,请不要让ThreadLocal中的Session对象保留在请求中 - 因为您无法控制线程,因此它们属于容器。

如果你需要在Web请求的生命周期内创建和关闭Session,并且你不想在任何地方传递Session对象,你应该考虑编写一个ServletFilter来处理清理 - 它将被调用每一个要求。您也可以让过滤器提交或回滚您可能已启动的任何事务。

您应该阅读此页面,了解如何执行此操作的简单方法:http://community.jboss.org/wiki/OpenSessioninView

答案 1 :(得分:0)

感谢您的回复。我目前在视图中使用open session,使用getCurrentSession(),这意味着会话是每个请求,在transaction.commit()上关闭。我可以看到会话正在被关闭(虽然没有被淘汰)但是ThreadWithAttributes tomcat类以某种方式持有对sessionImpl的引用,防止它被垃圾收集。每个线程都会发生这种情况我的数据库非常大,因此这会在最多几个小时或一天之后导致内存不足错误,并且服务器需要被退回。