当前位置: 代码迷 >> J2EE >> Hibernate query.list() 回到很慢 要等9秒
  详细解决方案

Hibernate query.list() 回到很慢 要等9秒

热度:347   发布时间:2016-04-19 22:13:37.0
Hibernate query.list() 返回很慢 要等9秒
public PageModel findByPageScroll(String hql, int firstPage, int maxPage,String action) {
PageModel pm = new PageModel();

    Session session = this.getHibernateTemplate().getSessionFactory().openSession();

Query query = session.createQuery(hql);

        query.setFirstResult(firstPage);
query.setMaxResults(maxPage);
ArrayList  list=(ArrayList) query.list(); //这里没问题
Iterator iterator1 = list.iterator();


int approvalID;
String approvalName;
String approvalresult = null;
LeaveOrOtKindbean st;
List<LeaveOrOtKindbean> list1 = new ArrayList<LeaveOrOtKindbean>();
while (iterator1.hasNext()){
st = new LeaveOrOtKindbean();
    Object[] object = (Object[]) iterator1.next();
LeaveOrOt l=(LeaveOrOt) object[0];
LeaveOrOtKind lk=(LeaveOrOtKind) object[1];
User u =(User) object[2];

approvalName=findUsername(l.getApprovalID1());  //调用了下一个方法

st.setApprovalName(approvalName);
list1.add(st);


}
pm.setRecordsDate( list1);
pm.setAction(action);
pm.setTotal(((Long)QueryCount.getQueryCount(hql, session)).intValue());
pm.setCurrentPage(firstPage);
pm.setManPage(maxPage);

session.clear();
session.close();
return pm;
}

public String findUsername(int id){ //通过id 获得user表的name
    String hql="from User u where u.userId="+id;
    Session session=this.getHibernateTemplate().getSessionFactory().openSession();  
Query query=session.createQuery(hql);
List<User>list=query.list();   //这条运行的很慢 要9秒
String name=list.get(0).getName();
session.clear();
session.close();
return name;
}
 
求大神 给个决解办法
------解决方案--------------------
引用:
仔细看了代码感觉代码很乱

没有分层,spring注入也没用到。


openSession();
session.clear();
session.close();

操作在循环里面执行次数很多

乱归乱,并不应该9秒才返回一个使用id的查询。
------解决方案--------------------
while (iterator1.hasNext()){
            st = new LeaveOrOtKindbean();
            Object[] object = (Object[]) iterator1.next();
            LeaveOrOt l=(LeaveOrOt) object[0];
            LeaveOrOtKind lk=(LeaveOrOtKind) object[1];
            User u =(User) object[2];
             
            approvalName=findUsername(l.getApprovalID1());  //每次循环都打开一个新的session,连接池都会爆掉,不慢才怪
 
            st.setApprovalName(approvalName);
            list1.add(st);           
             
             
    }
还是采用spring的代理类来管理事务吧,不会百度
------解决方案--------------------
你这个可能是session上出的问题,你可以配置直接使用getCurrentSession代替openSession,配置TransactionManager,让spring管理session试试。
引用:
Quote: 引用:

既然使用了HibernateTemplate,为什么不使用getCurrentSession方法,还有自己去开启session



.openSession()不是和getCurrentSession不能一起用的呀
  相关解决方案