我使用與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次。
我怎麼能轉換成上述休眠子查詢?我是休眠的新手。
你能告訴我我的代碼中有什麼錯誤嗎? –
此查詢 字符串queryques = 「從SetWiseQuesDetailTable setWiseQuesDetailTable其中setWiseQuesDetailTable.set_nm = 'A' 由setWiseQuesDetailTable.sl_no順序」; 沒有參數。這意味着它總是返回相同的結果。要連續多次執行這個查詢(或者你的情況,15k次)幾乎肯定是一個錯誤。 OMRDetailsTable實體和SetWiseQuesDetailTable條目之間的關係是什麼?第二個查詢中是否應該有基於當前OMRDetailsTable的連接或過濾器? –
Nathan是對的,你的內部查詢每次都是一樣的,並且在循環迭代時執行。因此,您可能會在結果頁面中看到與您的每個外部對象相同的「Inner Loop:」。 您還應該確保您的語句按照邏輯順序排列。定義內部查詢,然後寫入一些不相關的輸出,然後運行並打印內部查詢。讓它更順序。 您還需要處理變量的名稱。 –