我们刚刚开始使用Hibernate并且仍然习惯它的工作方式。
我们看到的事情是,即使在所有会话都关闭且引用超出范围之后,hibernate仍然似乎在其缓存中维护以前使用的数据库值。
我们的代码可以在多个传递中从一组表中读取。因为所有的内存都非常谨慎地释放,后来的传递速度变慢了。
有没有办法强制Hibernate清除它的缓存?
显式调用System.gc()没有帮助。 (是的,我知道这是一个建议)
其他信息:我们已明确禁用了二级缓存。
答案 0 :(得分:10)
您可以尝试调用Session.clear来强制清除第一级缓存。请务必先调用Session.flush将任何挂起的更改写入数据库。如果“修复”了问题,那么我怀疑某些东西仍然保持对会话的引用,防止缓存中的对象被垃圾收集。您可能需要获取程序的堆转储以跟踪泄漏。
答案 1 :(得分:2)
Hibernate还有一个可选的二级缓存,它可以正常运行。我同意Rob,最简单的方法是在会话结束后查看内存中仍然存在的内容。
我目前最喜欢的工具是YourKit,这是商业用途并不便宜。他们曾经提供(并且可能仍然提供)非常便宜的个人许可证选项($ 99 IIRC)。在对Alfresco ECM的堆使用问题进行故障排除时,我已经使用YourKit来完成此任务。还有其他可用的工具(例如CodeGear JGears),据我所知也很有用。
您可以考虑在评估模式下使用产品 - 如果发现问题则可以获得保留;)