2015-09-27 108 views
0

我正在使用Hibernate的Struts2。为了从数据库访问数据,我使用了休眠。我用下面的Hibernate配置休眠SQL工作缓慢

<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> 

而且我用下面的SQL查询:

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); 
    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(); 
    try { 
     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>(); 
     List<SetWiseQuesDetailTable> result_2 = query1.list();   

     for(SetWiseQuesDetailTable setDetails : result_2) { 
     System.out.println(setDetails.getQa()); 
     } 
     catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 

这是在这里一类,我映射:

@Entity 
@Table(name="reject_list") 
public class RejectListTable { 
    @Column(name="centre_code") 
    private int centre_code = 0; 

    @Id 
    @Column(name="roll_no") 
    private String roll_no = null; 

    @Column(name="rej_status") 
    private String rej_status = null; 

    @Column(name="error_type") 
    private String error_type = null; 

    public int getCentre_code() { 
    return centre_code; 
    } 

    public void setCentre_code(int centre_code) { 
    this.centre_code = centre_code; 
    } 

    public String getRoll_no() { 
    return roll_no; 
    } 

    public void setRoll_no(String roll_no) { 
    this.roll_no = roll_no; 
    } 

    public String getRej_status() { 
    return rej_status; 
    } 

    public void setRej_status(String rej_status) { 
    this.rej_status = rej_status; 
    } 

    public String getError_type() { 
    return error_type; 
    } 

    public void setError_type(String error_type) { 
    this.error_type = error_type; 
    } 
} 

但是,当我执行上面的代码它的工作太慢了。我不知道为什么可能我错过了一些东西,因为我在'HIBERNATE'中很新。当我没有休眠执行上面的代码时,它工作正常。

有关其他信息: OMRDetailsTable有15000条记录,SetWiseQuesDetailTable有300条记录。

有什么建议吗?

+0

您能否提供映射类配置以查看您如何使用hibernate映射它们? – dinukadev

+0

您在内部查询中没有使用result_1中的任何内容。那么循环result_1的目的是什么? – user2953113

+0

我使用了result_1中的数据,但我只是删除了代码,因为它太长了。 –

回答

0

您必须尝试使用​​JPA。使用标准可以获得级联的数据。

+0

有没有其他方法可以做到这一点?你能提供一些例子吗? –

0

我相信你需要调整你的sql查询。

这里是我的建议,你可以调整它进一步

原来的查询计划:

explain 
select * 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 PLAN 
------------------------------------------------------------------------------------------------------------------------- 
Sort (cost=53.73..53.73 rows=1 width=154) 
    Sort Key: omrdetailstable.roll_no 
    -> Seq Scan on omrdetailstable (cost=36.02..53.72 rows=1 width=154) 
     Filter: ((NOT (hashed SubPlan 1)) AND (NOT (hashed SubPlan 2)) AND ((omr_error)::text = ANY ('{T,U}'::text[]))) 
     SubPlan 1 
      -> Seq Scan on rejectlisttable (cost=0.00..18.00 rows=3 width=58) 
      Filter: ((rej_status)::text = 'R'::text) 
     SubPlan 2 
      -> Seq Scan on rejectlisttable rejectlisttable_1 (cost=0.00..18.00 rows=3 width=58) 
      Filter: ((rej_status)::text = 'R'::text) 
    (10 rows) 

修改后的查询计划:

explain 
WITH RejectList(roll_no) 
AS(
    select roll_no from RejectListTable rejectListTable where rejectListTable.rej_status='R' 
) 
SELECT * from OMRDetailsTable omrDetailsTable WHERE NOT EXISTS(
select 1 from RejectList rl 
where omrDetailsTable.bar_code_no != rl.roll_no AND omrDetailsTable.roll_no != rl.roll_no 
) and omrDetailsTable.omr_error in('T','U') 

                  QUERY PLAN 
------------------------------------------------------------------------------------------------------------------------------------------ 
Nested Loop Anti Join (cost=18.00..33.79 rows=3 width=154) 
    Join Filter: (((omrdetailstable.bar_code_no)::text <> (rl.roll_no)::text) AND ((omrdetailstable.roll_no)::text <> (rl.roll_no)::text)) 
    CTE rejectlist 
    -> Seq Scan on rejectlisttable (cost=0.00..18.00 rows=3 width=58) 
      Filter: ((rej_status)::text = 'R'::text) 
    -> Seq Scan on omrdetailstable (cost=0.00..15.50 rows=4 width=154) 
    Filter: ((omr_error)::text = ANY ('{T,U}'::text[])) 
    -> CTE Scan on rejectlist rl (cost=0.00..0.06 rows=3 width=58) 
(8 rows) 

正如你可以清楚地看到第二成本先查询。第一个查询在拒绝表上有两个表扫描,在第二个查询中减少为一个表扫描。

+0

我错过了hibernate配置文件中的任何内容吗? –