2011-02-26 61 views
0

的Hibernate 3.3Hibernate - HQL查询产生的SQL是否被hibernate系统缓存?

如果我有一个动态生成hibernate的HQL查询一样

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

代码是否会得到关于分贝执行得到由SessionManager缓存生成的SQL因此,如果同样的查询一直执行,不必每次都重新编译,或者每次都会重新进行重新解析和重建

我在想,以增加我的数据库代码的表现我得写一些静态命名查询休眠,以减少解析开销,如果有一些。

+0

SQL是每次生成。该查询不被分析第二次在同一个会话(前提是你使用的createQuery(查询)的结果相同) – bestsss 2011-02-26 01:04:37

+0

阿那将是致命的问题,我认为我们,所以基本上你说,每次的createQuery被调用时,它的重 - 正确的?如果这样我们可能应该改变我们的模式。 – toths 2011-02-26 01:06:15

+0

不,如果使用命名查询,则不会解析该字符串,但会生成sql。我对SQL的生成几乎感到乐观,但我可能需要检查源代码。我不使用查询自己,但标准。如tdavies指出的, – bestsss 2011-02-26 01:17:34

回答

0

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

有些事情要检查该查询的性能:

  • 你对createdBefore一个合适的指数?
  • 是其Foo与其他对象的合适'的关系 - 即他们是懒惰的,如果可能的和严格的,如果必要的。假设Foo有一个从Bar表中加载的成员。如果您的关系懒惰,你避免加入,但如果你再访问Bar属于你所做n多个查询每个Foo,并会更好过设置lazy="false"
  • 如果多次使用before的相同值进行查询,并且Foo表仅通过Hibernate更新,并且不会更新得比查询更频繁,并且结果集的大小不会太大,您可以使用query cache

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

+0

“SQL不会被缓存,因为您每次都创建一个新的Query” - 您错了! Hibernate为每个sql查询创建SQLQueryPlan对象。 Hibernate总是使用相同的SQLQueryPlan对象,然后对同一个SQL查询调用“createQuery”方法两次或更多次。 – 2012-04-27 07:33:18