问题:hibernate 查询 TbDefectTable对象 233条数据需要5-6秒时间
此项目为公司拥有很久历史的项目
TbDefectTable对象有20个字段 + TbDefectTable关联对象 5个字段
hibernate版本:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.0
Created-By: 1.5.0_13-119 (Apple Inc.)
Implementation-Title: Hibernate3
Implementation-Version: 3.2.6.ga
Implementation-Vendor: hibernate.org
Hibernate-Version: 3.2.6.ga
猜测:查询语句太复杂执行慢(将hibernate打印语句放数据库直接执行速度很快 )×
猜测:每次都需要重新连接数据库或连接池资源耗尽… ×
猜测: 数据表被锁×
猜测:查询后xml与对象映射过程耗时较多 √
猜测:…
//解决:查出来数据后自定义转化为对象的方法
public List getFindDefectByHql(String hql){
List<Map<String, Object>> list_map = new ArrayList();
List<TbDefectTable> list = new ArrayList<TbDefectTable>();
try {
long start = System.currentTimeMillis();
Session session = HibernateUtil.currentSession();
String sql = "select * " + hql.replaceAll("TbDefectTable", "Tb_Defect_Table");
SQLQuery query = session.createSQLQuery(sql);
query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
//query.addEntity(TbDefectTable.class);//发现是此方法影响性能
list_map = query.list();//执行查询
for (int i = 0; i < list_map.size(); i++) {//将查出的数据进行处理
TbDefectTable bean = mapToBean(list_map.get(i));//转换成对象
list.add(bean);
}
long res = System.currentTimeMillis() - start;
System.out.println("耗时:" + res + ",结果:" + list.size() + ",执行:" + sql);
}catch(Exception e){e.printStackTrace();
}finally{HibernateUtil.closeSession();}
return list;
}
//将Map转换成对象
public static TbDefectTable mapToBean(Map<String, Object> map) {
TbDefectTable bean = new TbDefectTable();
BeanMap beanMap = BeanMap.create(bean);
beanMap.putAll(map);
return bean;
}