什么会导致休眠性能以非决定性方式波动?
我有一个项目,我们每晚进行性能测试。这是每天晚上相同的测试,我们的网站被数百个并发“用户”击中3小时。性能结果最终处于两种状态之一 - 坏或好,并且每种状态似乎都与自身一致。我们的数据库人员(oracle btw)注意到,在性能不佳的日子里,我们会比好日子里有更多的调用,但只有一个查询。
从我到目前为止的分析来看,我认为这与休眠选择使用/不使用代理有关,但我无法理解什么会在某些日子里直接休眠这样做,而不是在其他日子里。什么会导致Hibernate中这种不稳定的非确定性行为?我在Hibernate 4.2.0和春天。我们没有使用第二级缓存。我们的服务器上没有其他应用程序。
导致发出此调用的对象位于通过父/子对象相关的长对象链的末尾。我们正在成为这个链条的负责人。
运行不畅,注意9wu的4m处决...查询
运行良好,注意9wu的630k执行...查询
编辑:我无法在模块中主要重现这一点。似乎当我将-xmx设置为非常低(28m)时,额外的调用不存在,但是在xmx = 128m时,我得到了最多的运行。关于在Hibernate中的位置的任何提示,我可以看到为什么/如何决定它是否应该代理?
编辑2:我无法在我的模块中一致地复制。它将在5次运行中工作得很好,然后在3次运行中失败,然后工作然后失败。每次我都在运行完全相同的单元测试。这似乎是一个N + 1问题,它通过“选择项目0...”加载了一堆孩子。查询,但在良好的运行期间,它决定使用另一个查询,或者它不会丢弃 Web 服务调用之间的条目。我将看看我能做些什么来混淆我的对象并提供一些细节。不幸的是,IT是存储在数据库中的树,它使用带有鉴别器的继承。