我在Oracle上檢測到hibernate和本機查詢的性能問題。當我用TOAD上的幾個參數執行一個複雜的SQL查詢時,我以毫秒爲單位得到結果。但是,當我使用Hibernate執行相同的查詢時,這個時間會大大增加(最多4秒或甚至更多)。在Hibernate + Java上性能下降,但在使用相同的本機Oracle查詢使用TOAD時速度很快
我的SQL查詢相當複雜,返回一個唯一值(因此,問題與安裝類所需的時間無關),它包含幾個格式爲':nameParameter'的參數。該查詢存儲在一個字符串中。例如,
String myNamedNativeQuery = "select count(*) from tables "+
"where column1 = :nameParameter1 "+
"and column2 = :nameParameter2";
//actually my sentence is much more complex!!
當我在TOAD上執行該句子時,它會在幾個毫秒內解析出來。但是用這句話與Hibernate
SQLQuery query = session.createSQLQuery("myNamedNativeQuery");
query.setParameter(nameParameter1, value1);
query.setParameter(nameParameter2, value2);
query.uniqueResult();
需要幾秒鐘才能得到同樣的結果。
我意識到如果我直接在本機查詢中替換參數,然後使用Hibernate執行這個句子,時間會大大減少。這將是這樣的:
String strQuery = session.getNamedQuery("myNamedNativeQuery").getQueryString();
myNamedNativeQuery = myNamedNativeQuery.replace("nameParameter1", value1);
myNamedNativeQuery = myNamedNativeQuery.replace("nameParameter2", value2);
SQLQuery query = session.createSQLQuery("myNamedNativeQuery");
query.uniqueResult();
任何人都知道發生了什麼?
在此先感謝。
PS:Oracle的版本是9i和休眠3.2
用hibernate打開「show sql」選項。它會告訴你hibernate正在運行的查詢,並會告訴你爲什麼它需要這麼長時間。 –