【发布时间】:2014-01-31 09:15:56
【问题描述】:
调用org.hibernate.Query#list 的方法存在性能问题。方法调用的持续时间随时间而变化:通常持续大约一秒,但有些日子,可能半天,大约需要 20 秒。
如何解决此问题?如何确定此问题的原因?
更多元素在分析这个问题:
- 在生产环境中观察到性能问题,但所描述的问题是在测试环境中。
- 该问题已被观察了至少数周,但其起源日期未知。
- 基础查询是 MS SQL Server (2008 R2) 中的视图(选择):
- 此测试环境中的数据库读取/写入一次仅来自几个用户:不应过度请求数据库服务器,并且数据只会随时间缓慢变化。
- 直接从 MS SQL Server 客户端执行精确查询总是只需不到一秒。
- 复制数据库(使用 MS SQL Server 客户端备份数据库并将此备份还原为新数据库)不允许重现问题:方法调用导致复制速度很快。
- 应用程序使用 Hibernate (4.2.X) 和 Java 6。
- 从 Hibernate 3.5 升级到 4.2 并没有改变任何问题。
- 方法调用始终使用相同的参数:有一个执行操作的测试方法。
- 分析方法调用(使用 hprof)表明,当它很长时,大部分时间都花在“Object.wait”和“ref.ReferenceQueue.remove”上。
- 在方法调用期间使用log4jdbc 记录底层查询持续时间显示以下结果:
- 查询方法~1s
- 查询~3s =>方法~20s
- 查询生成 POJO,如来自 this issue 的投票最多的答案中所述。
- 我没有尝试使用具有所有属性的构造函数,如this other similar issue 的投票最多的答案中所述,因为我不明白这会产生什么影响。
【问题讨论】:
标签: sql-server hibernate