2015-09-27 2 views
0

Я работаю над Struts2 с Hibernate. Для доступа к данным из базы данных я использую спящий режим. Я использовал следующие настройки спящего режимаHibernate SQL working slow

<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

Можете ли вы предоставить конфигурацию класса отображения, чтобы увидеть, как вы их сопоставили с помощью спящего режима? – dinukadev

+0

Вы не используете ничего из result_1 во внутреннем запросе. Тогда в чем цель петли result_1? – user2953113

+0

Я использовал данные из результата_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? –