2009-05-29 47 views
5

我们刚刚开始使用Hibernate,并且仍在习惯它的工作方式。如何在会话关闭后强制hibernate释放内存?

我们已经看到的事情是,即使在所有会话关闭并且引用已经超出范围之后,hibernate仍然似乎将之前使用的数据库值保留在其缓存中。

我们有从多组表中读取多次的代码。因为所有的内存都非常节制地释放,所以后来传递的速度变慢了。

有什么办法强制Hibernate清除它的缓存吗?

对System.gc()的显式调用没有帮助。 (是的,我知道这是一个建议)

附加信息:我们明确地禁用了二级缓存。

+3

我假设你不使用Hibernate的二级缓存呢?您使用什么策略进行会话管理? “会话每线程”? – 2009-05-29 22:14:57

+0

我们使用的是session-per-thread,并且我们已经明确地禁用了二级缓存 – StudioEvoque 2009-05-30 18:31:57

回答

10

您可以尝试调用Session.clear强制清除第一级缓存。请务必首先调用Session.flush,将任何挂起的更改写入数据库。如果这样“修复”了问题,那么我怀疑某些东西仍然持有对会话的引用,从而阻止了缓存中的对象被垃圾收集。您可能需要获得程序的堆转储来追踪泄漏。

+0

它“修复了”这个问题:) 正如你所建议的,我们正在审查一些我们创建的“HibernateUtils”坚持会议参考。 – StudioEvoque 2009-06-02 16:38:51

2

Hibernate还有一个可选的二级缓存可以在场。我同意Rob的看法,最简单的方法是在会话结束后查看内存中的内容。

我目前最喜欢的工具是YourKit这是商业和不完全便宜。他们曾经提供(并且可能仍然会提供)非常便宜的个人许可选项(99美元IIRC)。在解决Alfresco ECM的堆使用问题时,我已经使用YourKit来完成此任务。还有其他工具可用(例如CodeGear JGears),我也了解它也很好。

你可能会考虑在评估模式下使用的产品 - 如果发现您的问题,它可能会物尽其)

相关问题