14

我有一个项目,我们每晚进行一次性能测试。每天晚上,我们的网站都会被数百名并发“用户”访问 3 小时,这是相同的测试。性能结果最终处于两种状态之一 - 坏或好,并且每个状态似乎都与自身一致。我们的数据库人员(oracle btw)注意到,在性能不佳的日子里,我们会比在好的日子里接到很多很多的电话,但只有一个查询。

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

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

表现不佳 一个糟糕的运行,注意 9wu... 查询的 4m 执行

一夜的精彩表演 运行良好,注意 9wu... 查询的 630k 次执行

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

编辑 2:我无法在我的模块中始终如一地重现。它适用于 5 次运行然后失败 3 次然后运行然后失败。每次我运行完全相同的单元测试时。这似乎是一个 N+1 问题,它通过“select item0 ...”查询加载了一堆孩子,但是在良好运行期间它决定使用另一个查询,或者它不丢弃来自 web 服务之间的条目来电。我会看看我能做些什么来混淆我的对象并提供一些细节。不幸的是,IT 是存储在数据库中的一棵树,它使用带有鉴别器的继承。

4

2 回答 2

4

当然,很难说为什么会发生这种情况。但是,有一些很好的资源可用于优化 Hibernate 的性能并调试它的问题

在链接的文章中,作者建议诊断性能问题的最佳方法是使用YourKit Java Profiler。如果您的负载和性能环境是远程的,并且您无法在本地运行分析器,则可以远程附加一个。当然,运行分析器会产生一些开销,因此您可能会发现性能特征发生了变化,因为您附加了一个。尽管如此,这可能是您追踪正在发生的事情的最佳选择。

其他有用的链接:

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

于 2013-07-23T00:49:04.367 回答
0

您的 Oracle 是否为 9 或更少,您的数据库是否已损坏您可以导出和导入您的数据库以防万一 http://www.oracle-base.com/articles/misc/detect-and-correct-corruption.php

于 2013-07-25T04:31:07.533 回答