java Hibernate sql查询处理速度比普通查询慢
我正在使用hibernate和Struts2。之前,我只在普通数据库查询(Postgres)中使用Struts2。现在我正试图用hibernate修改我的数据库结构。但问题是,当我在hibernate中修改代码时,它的工作速度太慢了
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配置文件:
<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次
如何在Hibernate中转换上述子查询?我是冬眠新手
# 1 楼答案
这段代码每次都在内部循环中执行相同的查询。它不依赖于外部查询的结果。这会让我怀疑您没有正确迁移所有内容。如果只是在开始时执行查询,然后编写嵌套循环,那么这段代码的结果也会相同。第二个查询每次都会加载数据库中的所有匹配记录,而不是与外部循环中正在处理的条目对应的某个子集
但是,您还应该知道,hibernate可能会添加额外的连接,以加载其表可能未包含在原始SQL中的其他实体。Yourconfig已启用查询日志记录。联接中是否有其他表?我已经看到,这些额外的连接以及后续的延迟加载操作会导致性能下降,其系数为1000
Hibernate使用反射,它比编译代码慢,但我不考虑这个问题,直到我确信我的代码是等价的。p>