我有一个调用 org.hibernate.Query#list
的方法的性能问题。该方法呼叫的持续时间随时间而变化:通常持续约一秒钟,但有几天,大概半天,大约需要20秒。
如何解决此问题?如何确定此问题的原因?
对此问题的分析中的更多元素:
- 在生产环境中观察到了性能问题,但是所描述的问题在测试环境中。
- 这个问题已经观察到至少数周,但其起源的日期尚不清楚。
- 基础查询是MS SQL Server(2008 R2)中的视图(选择):
- 数据库读取/写入此测试环境中一次来自少数几个用户:数据库服务器不应过分填充,并且数据仅随着时间的推移而缓慢变化。
- 直接从MS SQL Server客户端执行确切的查询始终少于一秒钟。
- 复制数据库(使用MS SQL Server客户端来备份数据库并将此备份还原为新数据库)不允许重现问题:该方法调用导致在重复方面快速。
- 从Hibernate 3.5升级到4.2并没有改变问题。
- 方法调用始终具有相同的参数:有一种操作的测试方法。
- 分析方法调用(使用HPROF)表明,当它长时间时,大部分时间都花在" object..ned"one_answers" ref.Ref.Referendeque.emove"。 上。
- 查询<1S =>方法〜1S
- 查询〜3S =>方法〜20S
冬眠查询显然随机缓慢的可能原因是会话的冲洗。如果同一事务中的某些语句(插入,更新,删除)未填写,则查询列表方法可能会自动插入(取决于当前的冲洗模式)。如果是这样,则性能问题甚至可能是由列表()的查询引起的。
看来,MS SQL Server和Procedure计划的更新似乎是:遵循DBCC freeproccache,dbcc dropCleanBuffers查询时间和方法时间是一致的。
问题解决方案可能是升级MS SQL Server:升级到MS SQL Server 2008 R2 SP2导致该问题不再出现。
似乎查询持续时间与该方法的持续时间之间的差异是与返回对象有关的指数因素:大部分时间都花在对结果集的插座上。