2015-11-07 65 views
-1

我使用與Struts2的冬眠。之前我只用Struts2和普通的數據庫查詢(Postgres)。現在我試圖用休眠來修改我的數據庫結構。但問題是,當我在休眠狀態下修改我的代碼時,其工作速度太慢。Hibernate的SQL查詢處理速度較慢再正常不過的查詢

public void evaluation() { 
    try { 
     String hql = "from OMRDetailsTable omrDetailsTable where omrDetailsTable.bar_code_no not in(select roll_no from RejectListTable rejectListTable where rejectListTable.rej_status='R') and omrDetailsTable.roll_no not in(select roll_no from RejectListTable rejectListTable where rejectListTable.rej_status='R') and omrDetailsTable.omr_error in('T','U') order by omrDetailsTable.roll_no"; 
     Query query = session.createQuery(hql); 
     query.setCacheable(false); 
     query.setReadOnly(true); 

     List<OMRDetailsTable> result_1 = query.list(); 

     Iterator<OMRDetailsTable> iterator = result_1.iterator(); 
     while(iterator.hasNext()){ 
     omrDetailsTable = (OMRDetailsTable) iterator.next(); 
     set_no = omrDetailsTable.getSet_no().toString(); 
     String queryques = "from SetWiseQuesDetailTable setWiseQuesDetailTable where setWiseQuesDetailTable.set_nm='A' order by setWiseQuesDetailTable.sl_no"; 

     Query query1 = session.createQuery(queryques); 
     List<String> ansDetailsList = new ArrayList<String>(); 
     ansDetailsList.add(omrDetailsTable.getSl_no()); 
     ansDetailsList.add(omrDetailsTable.getBar_code_no()); 
     ansDetailsList.add(omrDetailsTable.getRoll_no()); 
     ansDetailsList.add(set_no) 

     List<SetWiseQuesDetailTable> result_2 = query1.list(); 

     for(SetWiseQuesDetailTable setDetails : result_2) { 
      System.out.println("Inner loop"+setDetails); 
     }   
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

我上述功能用於從數據庫中獲取的數據。我使用了沒有休眠的同樣的方法,它的工作速度比上面的代碼快。

我的Hibernate配置文件:

<hibernate-configuration> 
<session-factory> 
<property name="connection.driver_class">org.postgresql.Driver</property> 
<property name="connection.url">jdbc:postgresql://localhost:5432/database</property> 
<property name="connection.username">postgres</property> 
<property name="connection.password">postgres</property> 

<property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property> 
<property name="show_sql">true</property> 
<property name="hbm2ddl.auto">update</property> 
<mapping class="com.templateproject.table.LoginTable" /> 
<mapping class="com.templateproject.table.OMRDetailsTable" /> 
<mapping class="com.templateproject.table.RejectListTable" /> 
<mapping class="com.templateproject.table.SetWiseQuesDetailTable" /> 
</session-factory> 
</hibernate-configuration>  

什麼是工作速度慢的原因?

對於額外的信息:OMRDetailsTable有15000條記錄,並SetWiseQuesDetailTable有300條記錄。意味着它將迭代4500000次。

我怎麼能轉換成上述休眠子查詢?我是休眠的新手。

回答

1

此代碼執行在內部循環每一次相同的查詢。它不依賴於外部查詢的結果。這會讓我懷疑你沒有正確地遷移一切。如果您剛剛在一開始執行了查詢,然後編寫了嵌套循環,那麼您將得到與此代碼相同的結果。第二個查詢每次加載數據庫中的所有匹配記錄,而不是與外循環中正在處理的條目相對應的某個子集。

不過,你也應該知道,休眠可以添加額外的加入到渴望加載額外的實體的表很可能不會被列入您的原始SQL。 Yourconfig已啓用查詢日誌記錄。您的聯接中是否有其他表格?我已經看到這些額外的連接以及隨後的延遲加載操作會導致性能下降,達到千分之一。

Hibernate使用反射,這比編譯代碼慢,但我不會考慮這個,直到我確信我的代碼是基 - 碳纖維當量。

+0

你能告訴我我的代碼中有什麼錯誤嗎? –

+0

此查詢 字符串queryques = 「從SetWiseQuesDetailTable setWiseQuesDetailTable其中setWiseQuesDetailTable.set_nm = 'A' 由setWiseQuesDetailTable.sl_no順序」; 沒有參數。這意味着它總是返回相同的結果。要連續多次執行這個查詢(或者你的情況,15k次)幾乎肯定是一個錯誤。 OMRDetailsTable實體和SetWiseQuesDetailTable條目之間的關係是什麼?第二個查詢中是否應該有基於當前OMRDetailsTable的連接或過濾器? –

+0

Nathan是對的,你的內部查詢每次都是一樣的,並且在循環迭代時執行。因此,您可能會在結果頁面中看到與您的每個外部對象相同的「Inner Loop:」。 您還應該確保您的語句按照邏輯順序排列。定義內部查詢,然後寫入一些不相關的輸出,然後運行並打印內部查詢。讓它更順序。 您還需要處理變量的名稱。 –