Hibernate sql查询处理比普通查询慢

时间:2015-11-07 11:12:24

标签: java hibernate postgresql

我正在使用Struts2的hibernate。之前我只使用Struts2进行普通的数据库查询(Postgres)。现在我正在尝试用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条记录。意味着它将迭代450000次。

如何在Hibernate中转换上面的子查询?我是休眠的新手。

1 个答案:

答案 0 :(得分:1)

此代码每次在内部循环中执行相同的查询。它不依赖于外部查询的结果。这会让我怀疑你没有正确迁移所有东西。如果您刚刚在开头执行了查询,然后编写了嵌套循环,那么您将获得与此代码相同的结果。第二个查询每次都会加载数据库中的所有匹配记录,而不是与外部循环中正在处理的条目对应的某个子集。

但是,您还应该知道,hibernate可能会添加额外的连接来加载其表,这些实体的表可能不会包含在原始SQL中。 Yourconfig启用了查询日志记录。您的联接中是否还有其他表格?我已经看到这些额外的连接以及随后的延迟加载操作会导致性能下降,并且会产生1000秒的因素。

Hibernate使用反射,这比编译代码慢,但我不会考虑这个,直到我确定我的代码功能相同。