2013-05-22 41 views
1

我們使用Hibernate命名查詢,如下所示: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和甲骨文11G

問題:
1:scene- Hibernate的背後將是使用預處理語句 - 是否正確?
2:我們可以從應用程序端做更多的事情 - 避免重新解析這個查詢?
3:我們可以在數據庫服務器上做什麼來避免重新解析?

回答

0

註釋談到解析資源(對比執行時間/資源),但聲明本身並沒有真正期待的是難以解析。最有意思的信息是執行計劃。我假設查詢總是相同的(但註釋中包含「可能」一詞)。

至於問題1:

如果你想確保預處理語句不幫助,您可以嘗試運行不休眠相同的查詢 - 只是普通的java.sql中,PreparedStatement的。

如果是這樣,有一個Hibernate準備的語句緩存,但我從來沒有使用它。

至於問題2:

如果這是您的熱點,您可以使用「直接SQL」與Hibernate(如果你的連接池允許的預處理語句緩存),甚至沒有它:那你有完全控制。

至於問題3:看看Oracle 11g結果緩存。