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

标签 java performance hibernate

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

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

导致发出此调用的对象位于通过父/子关联的一长串对象的末尾。我们正在这个链条的头部工作。

Bad performance 运行不佳,请注意 9wu... 查询的 4m 次执行

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

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

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

最佳答案

当然,很难说为什么会发生这种情况。然而,有一些很好的资源可以用于 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

关于java - 什么会导致 Hibernate 性能以不确定的方式波动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17754124/

相关文章:

java - 返回的 KnoxVpnUidStorageknoxVpnSupported API 值为 false

performance - 测量 Web 应用程序性能(压力测试)和带宽要求

python - 为什么 Python 中的浮点除法用较小的数字更快?

ios - ios应用程序在 'load?'时做什么

Hibernate 如何使用常量作为复合外部引用的一部分

hibernate - JBOSS 上用于 hibernate 的 JDBC jar 的位置

java - Displaytag 库 - 检测分页请求

java - 为什么我的数据库仅在前两个 jsp 表单提交时更新成功?

java - 在 Mac OS X 上将 tomcat jar/lib 目录添加到 eclipse 类路径

java - 是否可以在 @Pre/PostPersist 监听器中保留新实体?