2013-07-19 20 views
14

我有一个项目,我们进行夜间性能测试。每天晚上我们的网站被数百个并发“用户”打了3个小时,这是同样的测试。表现结果以两种状态中的一种状态出现 - 不好或不好,每种状态似乎都与自身一致。我们的数据库人员(oracle btw)注意到,在糟糕的性能表现日子里,我们会有比通常的好日子多得多的电话,但只有一个查询。什么会导致Hibernate的性能以非确定性的方式波动?

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

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

Bad performance 坏来看,9wu通知4米处决...查询

A night of good performance 的良好运行,注意9wu的630K处决...查询

编辑:我不能大部分都是在模块中重现这一点。看起来,当我把-xmx设置得非常低(28米)时,额外的呼叫不在那里,但是在xmx = 128m时,我获得了最多的运行。关于Hibernate在哪里的任何提示我可以看到为什么/如何决定它是否应该代理?

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

+0

我感兴趣的你的“从我的分析到目前为止,我认为它与Hibernate选择使用/不使用代理有关”。你指的是什么“代理”?如果您正在讨论实体的代理,我从来没有听说过Hibernate正在以非确定性的方式创建代理。你可否进一步阐述一下? –

+1

在我看来,它是这样的:1.你留下了所有懒惰取材的长链。 2。在某些情况下,你只是浏览链中的一小部分(这是个好例子),而在某些情况下,你正在导航大部分链,这会导致大量的懒取(这是不好的情况)。 3.或者,在某些特殊情况下,您正在做一些“不可重复使用的n + 1”提取。我强烈建议您在Hibernate中进行正确的日志记录,并调查在什么情况下会生成大量的SQL(这应该很明显) –

+0

您可以发布与查询相关的映射吗?我建议你在映射上启用热切获取并查看是否存在“这种不稳定的非确定性行为” –

回答

3

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

在链接的文章中,作者建议诊断性能问题的最佳方法是使用YourKit Java Profiler。如果你的负载和性能环境是远程的,并且你不能在本地运行profiler you can attach one remotely。当然,运行一个profiler会有一些开销,所以你可能会发现你的perforance特性已经改变了,因为你有一个附加的特性。不过,这可能是追踪发生的最好的选择。

其他有用的链接:

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

+0

感谢那些伟大的链接,我以前使用过你的工具包,但问题似乎在于休眠。我将获得hibernate资源。 – Ravedave

相关问题