【问题标题】:Hibernate sql query processing slower then normal queryHibernate sql 查询处理比普通查询慢
【发布时间】:2015-11-07 11:12:24
【问题描述】:

我在 Struts2 中使用休眠。在我只使用带有普通数据库查询(Postgres)的 Struts2 之前。现在我正在尝试用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-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 中转换上述子查询?我是休眠新手。

【问题讨论】:

    标签: java hibernate postgresql


    【解决方案1】:

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

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

    Hibernate 使用反射,这比编译代码慢,但我不会考虑这一点,直到我确定我的代码在功能上是等效的。

    【讨论】:

    • 你能告诉我我的代码有什么错误吗?
    • 此查询 String queryques = "来自 SetWiseQuesDetailTable setWiseQuesDetailTable where setWiseQuesDetailTable.set_nm='A' order by setWiseQuesDetailTable.sl_no";没有参数。这意味着它总是返回相同的结果。快速连续多次执行此查询(或在您的情况下为 15k 次)几乎可以肯定是一个错误。 OMRDetailsTable 实体和 SetWiseQuesDetailTable 条目之间有什么关系?基于当前 OMRDetailsTable 进行限制的第二个查询不应该有连接或过滤器吗?
    • Nathan 是对的,您的内部查询每次都是相同的,并且每次循环迭代时都会执行。因此,对于每个外部对象,您可能会在结果页面中看到相同的“内部循环:”。您还应该确保您的陈述符合逻辑顺序。定义内部查询,然后写入一些不相关的输出,然后运行并打印内部查询。使其更具顺序性。您还需要处理变量的名称。
    猜你喜欢
    • 1970-01-01
    • 2018-08-25
    • 2021-01-12
    • 2017-10-16
    • 1970-01-01
    • 2018-12-23
    • 2018-11-23
    • 2017-12-07
    • 2011-06-09
    相关资源
    最近更新 更多