什么会导致休眠性能以非决定性方式波动?

2022-09-04 04:37:27

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

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

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

Bad performance运行不畅,注意9wu的4m处决...查询

A night of good performance运行良好,注意9wu的630k执行...查询

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

编辑2:我无法在我的模块中一致地复制。它将在5次运行中工作得很好,然后在3次运行中失败,然后工作然后失败。每次我都在运行完全相同的单元测试。这似乎是一个N + 1问题,它通过“选择项目0...”加载了一堆孩子。查询,但在良好的运行期间,它决定使用另一个查询,或者它不会丢弃 Web 服务调用之间的条目。我将看看我能做些什么来混淆我的对象并提供一些细节。不幸的是,IT是存储在数据库中的树,它使用带有鉴别器的继承。


答案 1

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

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

其他有用的链接:

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


答案 2

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


推荐