有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

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

    但是,您还应该知道,hibernate可能会添加额外的连接,以加载其表可能未包含在原始SQL中的其他实体。Yourconfig已启用查询日志记录。联接中是否有其他表?我已经看到,这些额外的连接以及后续的延迟加载操作会导致性能下降,其系数为1000

    Hibernate使用反射,它比编译代码慢,但我不考虑这个问题,直到我确信我的代码是等价的。p>