什么会导致Hibernate性能以不确定的方式波动?

时间:2013-07-19 19:35:05

标签: java performance hibernate

我有一个项目,我们进行夜间性能测试。每天晚上我们的网站被数百名并发用户"持续3个小时。性能结果最终呈现两种状态之一 - 坏或好,每个状态似乎都与自身一致。我们的数据库人员(oracle顺便说一句)注意到,在性能不佳的日子里,我们会有很多很多,而不是好日子,但只有一个查询。

从我的分析到目前为止,我认为它与hibernate选择使用/不使用代理有关,但我无法理解什么会导致hibernate在某些日子里这样做而不是在其他日子。什么会导致Hibernate中出现这种不稳定的非确定性行为?我在Hibernate 4.2.0和Spring上。我们没有使用二级缓存。我们的服务器上没有其他应用程序。

导致此调用被发出的对象位于通过父/子相关的长链对象的末尾。我们正在成为这个链条的负责人。

Bad performance 一次糟糕的运行,请注意9w执行4m ...查询

A night of good performance 一个很好的运行,注意到9万...查询的630k执行

编辑:我无法在模块中重现这一点。似乎当我将-xmx设置得非常低(28m)时,额外的调用不存在,但是在xmx = 128m时,我得到了大部分运行。关于Hibernate在哪里可以看到为什么/如何决定它是否应该代理的任何提示?

编辑2:我无法在模块中一致地重现。它将适用于5次运行然后失败3然后工作然后失败。每次我运行完全相同的单元测试。它似乎确实是一个N + 1问题,它通过" select item0 ..."加载了一堆孩子。查询,但在良好的运行期间,它决定使用另一个查询,或者它不会丢弃webservice调用之间的条目。我将看到我可以做些什么来混淆我的对象并提供一些细节。遗憾的是,IT存储在数据库中,它使用带有鉴别器的继承。

2 个答案:

答案 0 :(得分:4)

当然,很难说为什么会发生这种情况。但是,optimizing performance in Hibernate and debugging problems with it有一些很好的资源。

在链接文章中,作者建议诊断性能问题的最佳方法是使用YourKit Java Profiler。如果您的负载和性能环境是远程的,并且您无法在本地运行探查器you can attach one remotely。当然,运行探查器有一些开销,因此您可能会发现您的穿孔特性已更改,因为您已连接了一个。不过,这可能是追踪正在发生的事情的最佳选择。

其他有用的链接:

http://java.dzone.com/articles/debugging-hibernate-generated http://jroller.com/jcarreira/date/20050223#hibernate_tips

答案 1 :(得分:0)

您的Oracle是否为9或更低可能您的数据库被破坏,您可以导出和导入您的数据库只是为了大小写 http://www.oracle-base.com/articles/misc/detect-and-correct-corruption.php