【问题标题】:org.hibernate.Query#list is randomly sloworg.hibernate.Query#list 随机缓慢
【发布时间】: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


    【解决方案1】:

    Hibernate 查询明显随机缓慢的一个可能原因是会话的刷新。如果同一事务中的某些语句(插入、更新、删除)未刷新,则 Query 的 list 方法可能会执行自动刷新(取决于当前的刷新模式)。如果是这种情况,性能问题甚至可能不是由调用 list() 的查询引起的。

    【讨论】:

    • 感谢您的回答。您能否描述一种测试您建议的原因的方法?可能是在测试可能有问题的操作之前刷新所有操作?
    【解决方案2】:

    似乎问题出在 MS SQL Server 和过程计划的更新上:在 DBCC FREEPROCCACHE、DBCC DROPCLEANBUFFERS 之后,查询和方法时间是一致的。

    问题的解决方案可能是升级 MS SQL Server:升级到 MS SQL Server 2008 R2 SP2 导致问题不再出现。

    查询的持续时间和方法的持续时间之间的差异似乎是与返回的对象相关的指数因素:大部分时间都花在了结果集的套接字读取上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-23
      • 2020-10-08
      • 2016-03-25
      • 2014-09-27
      • 2023-04-01
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多