Hibernate命名查询重新解析

时间:2013-05-22 14:11:36

标签: oracle hibernate jdbc prepared-statement

我们正在使用hibernate命名查询,如下所示:

named_query :   Select this_  from  TableA this_  where this_.id  in( select max(id) from TableA where COLA is null group by COLB ) and rownum=1  
Query query = getNamedQuery("nq.select.DirtySubject.onMaxDirtySubjectRecId");
List<SomeObject>  objectList       = query.list();

DBA标记了查询,逐字注释如下

  

这些表示消耗解析最多的SQL语句   每次执行时都有资源   出现在的SQL语句   这份报告可能正在重新解析。过度解析的SQL   应优化语句以降低其解析频率。这个   涉及使用绑定变量和相同的语句语法和大小写,   为了能够重用任何以前解析的语句   SQL缓存。
  检查这些查询以查看是否有任何SQL优化   可能而且合理。

其他重要事实: 此查询是轮询逻辑的一部分,并被反复触发 数据库:Oracle 11G
技术堆栈:Java,Hibernate,Tomcat,Linux,Oracle 11G

问题:
1:在幕后--Hibernate将使用Prepared声明 - 正确吗? 2:我们可以从应用程序端做些什么 - 避免重新解析此查询? 3:我们可以在数据库服务器上做什么以避免重新解析?

1 个答案:

答案 0 :(得分:0)

评论讨论解析资源(与执行时间/资源相反),但语句本身并不真正难以解析。最有趣的信息是执行计划。我假设查询总是相同的(但注释包含“可能”一词)。

关于问题1:

如果你想确保准备好的语句有帮助,你可以尝试在没有Hibernate的情况下运行相同的查询 - 只需简单的java.sql,PreparedStatement。

如果是这样,有一个Hibernate预处理语句缓存,但我从未使用它。

关于问题2:

如果这是您的热点,您可以将“direct SQL”与Hibernate一起使用(如果它和您的连接池允许缓存预准备语句),甚至不使用它:那么您就可以完全控制。

关于问题3:查看Oracle 11g结果缓存。