【问题标题】:Hibernate Query runs slow in the system, but fast when run directlyHibernate Query 在系统中运行缓慢,但直接运行时很快
【发布时间】:2010-10-13 03:04:42
【问题描述】:

我有一个类似于本周播客的问题。

我们有一个使用带有 Sql Server 2005 的休眠的 Java 应用程序。

Hibernate 正在为我们生成一个查询,这需要将近 20 分钟才能完成。

如果我们使用 show_sql 进行相同的查询并将问号替换为常数值,则立即返回答案。

我认为我们需要选项(重新编译),但我不知道如何使用 HQL。

请帮忙!

【问题讨论】:

  • 其他休眠查询是否执行正常?
  • 请发布休眠对象和查询代码以及它正在生成的sql。
  • Kees,是的,其他查询执行正常。不幸的是,休眠对象和查询代码太复杂了,无法共享。

标签: sql-server sql-server-2005 hibernate performance


【解决方案1】:

从您的问题描述来看,您似乎遇到了参数嗅探。从本质上讲,SQL Server 正在根据传入的一组较旧的参数值创建查询计划,这些参数值不会为当前运行的查询创建有效的执行计划。

通常我通过将参数值传递到局部变量并在我的查询中使用这些参数值或使用 OPTION (RECOMPILE) 来解决此问题。但是,由于您使用的是 Hibernate,因此我通常的解决方案不适合您。据我了解,最好的选择是使用 Hibernate 使用 prepareStatement() 或 createSQLQuery() 运行本机 SQL 查询,不幸的是,这消除了使用 Hibernate 的一些好处。

【讨论】:

  • 迟来的感谢,耶利米。这是我最终得到的解决方案,在 Hibernate 中生成语句,然后检索 SQL 并直接执行。
【解决方案2】:

根据我的经验,Hibernate 中复杂查询的主要问题不是查询本身,而是代表结果集的所有对象的创建。

在我的工作案例中,我们有一个非常大的域模型,有很多耦合,因此即使从数据库中获取一个对象也非常昂贵,因为该对象链接到其他对象,而这些对象又链接到其他对象等等。

对我们来说,更多地使用延迟加载至少解决了部分问题。智能缓存的帮助更大。我学到的是,在未来,我将允许域类之间更松散的耦合。

【讨论】:

    【解决方案3】:

    您应该发布您的映射和 HQL 语句。如果您在 HQL 中使用“join”,您可能想看看 Hibernate 究竟获取了什么。事实证明,请求本身很简单,但 Hibernate 会在它到达之前获取大量数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-22
      • 2021-05-02
      • 1970-01-01
      • 2011-12-14
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      相关资源
      最近更新 更多