我有一个项目,我们每晚进行一次性能测试。每天晚上,我们的网站都会被数百名并发“用户”访问 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 是存储在数据库中的一棵树,它使用带有鉴别器的继承。