Hibernate使用小記

在使用Hibernate開發的過程當中,遇到場景in條件查詢,查詢條件裏的個數超過1w甚至更高(且不討論這種方式是否合理),在生成hql,執行查詢的時候發現執行list()方法的時候特別慢。後經從網查詢資料,得知:java

Hibernate首先是使用了本身的數據庫操做語言-HQL 
Hibernate解析HQL的編譯分析器用的是ANTLR分析器 
HQL雖然是一種數據庫操做語言,它只是方便編寫和使用,本質上仍是要轉換成SQL語言來在數據庫上執行的。 
Hibernate在轉換時主要用到了ANTLR,ANTLR是JAVA編寫的詞法分析器和語法分析器,功能很強大。 
ANTLR將HQL轉化成SQL語句,再實際執行SQL語句。 
ANTLR所對應的文件名的格式是*.g的格式,Hibernate的jar包中含有3個語法定義文件。 
Hibernate包含了3個語法定義文件: 
 1. hql.g定義了詞法分析和語法分析,將hql解釋成hql的抽象語法樹(AST) 。 
 2. hql-sql.g將hql AST轉化爲sql AST,將生成模塊與hibernate解耦。 
 3. sql -gen.g 從sql AST生成sql 語言。  

詳細能夠查看Hibernate中的createQuery()的調用過程 
經過QueryPlanCache的getHQLQueryPlan()方法得到查詢計劃HQLQueryPlan的一個實例,然後者主要是調用了 QueryTranslator的compile方法,編譯HQL語句。在QueryTranslator的繼承類 QueryTranslatorImpl的doCompile觀察這個過程: 
PHASE 1 : Parse the HQL into an AST. 
PHASE 2 : Analyze the HQL AST, and produce an SQL AST. 
PHASE 3 : Generate the SQL. 
 sql

而後定位Debug發如今執行QueryTansalatorImpl類中的doCompile方法時消耗時間太長:數據庫

原來hql語句太長,ANTLR對hql進行編譯成sql的過程當中就要消耗很長的時間。以後咱們經過使用hbernate中的Criteria條件查詢來實現了查詢,效率明顯提升了上來。性能

criteria是hibernate特有的查詢的方法,是面向對象的一種查詢,可讓沒有sql基礎的開發者也可以準確的使用hibernate來操做數據庫。優化

HQL是在java語言層面以外的另外一種數據查詢語言,和SQL極其接近,通用性強,便於SQL經驗者使用,須要語法解析。考慮移植性時使用。
Criteria API是在java語言內的接口,不須要語法解析,直接操做底層對象,寫出查詢代碼沒有通用性。性能最大優化時使用。

另,經過原生sql方式也能夠提升效率。spa

相關文章
相關標籤/搜索