【问题标题】:Hibernate - Does the resulting SQL from a HQL query get cached by the hibernate system?Hibernate - 来自 HQL 查询的结果 SQL 是否被休眠系统缓存?
【发布时间】:2011-02-26 00:41:18
【问题描述】:

休眠 3.3

如果我有动态创建休眠 hql 查询的代码,例如

String query = "from Foo where ";
if( beforeDate != null ) then query+=" createdBefore < :before";
session.createQuery(query);

将在 db 上执行的生成的 sql 是否由 SessionManager 缓存,这样如果相同的查询继续执行,它就不必每次都重新编译,或者每次都由休眠重新解析和重建?

我在想,为了提高我的数据库代码的性能,我必须在 hibernate 中编写一些静态命名查询,以减少解析开销(如果有的话)。

【问题讨论】:

  • 每次生成sql。查询不会在同一会话中第二次解析(假设您使用相同的 createQuery(query) 结果)
  • 啊,这很麻烦,我认为我们是这样,所以基本上你说每次调用 createQuery 时,它都会重新解析正确吗?如果是这样,我们可能应该改变我们的模式。
  • 否,如果使用命名查询,则不解析字符串,但要生成sql。我对 SQL 的生成几乎持肯定态度,但我可能需要检查源代码。我自己不使用查询,而是使用标准。
  • 正如 tdavies 指出的那样,导致速度变慢的主要原因应该是数据库执行,而不是休眠中的查询处理时间。

标签: java sql hibernate


【解决方案1】:

SQL 不会被缓存,因为您每次都在创建一个新的查询。您可以缓存查询,但我怀疑解析开销是否很大。

检查该查询性能的一些事项:

  • createdBefore 上有合适的索引吗?
  • Foo 与其他对象的关系是否“适当”——也就是说,如果可能,它们是惰性的,必要时是严格的。假设Foo 有一个从Bar 表加载的成员。如果你让关系变得懒惰,你可以避免加入,但是如果你访问属于每个FooBar,你已经完成了n 更多的查询,最好设置lazy="false"。李>
  • 如果多次查询before的值相同,而Foo表只通过Hibernate更新,并且更新频率不超过查询次数,结果集大小不太大,你可以使用query cache

与任何性能问题一样,请确保您在测量前后具有可重复性。

【讨论】:

  • “SQL 不会被缓存,因为你每次都在创建一个新的查询”——你错了! Hibernate 为每个 sql 查询创建 SQLQueryPlan 对象。 Hibernate 总是使用相同的 SQLQueryPlan 对象,然后您为相同的 sql 查询调用“createQuery”方法两次或更多次。
猜你喜欢
  • 2015-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
相关资源
最近更新 更多