SSH框架, 执行查询操作的时候 速度慢的要死,调试的时候卡到Dao层getHibernateTemplate().find(hql) 这段代码。能卡3——5分钟 不动要查询的表中就1012 条数据 (5列), 应该不至于这么慢啊? 谁能解释下,应该怎么办啊 ???一下是代码片段:action:
List basicList = super.getRightBiz().findAllBasicDataByNoteId(-1);//查询所有基础数据
request.getSession().setAttribute("basicList", basicList);
biz:
public List findAllBasicDataByNoteId(int noteId) {
String hql = "from BasicData where 1=1";
//noteId 值为大于等于0时,根据上级目录ID查询
if(noteId>=0){
hql+=" and noteId ="+noteId;
}
return super.getBaseDao().findObject(hql);
}dao:
public List findObject(String hql) {
try {
return super.getHibernateTemplate().find(hql);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
List basicList = super.getRightBiz().findAllBasicDataByNoteId(-1);//查询所有基础数据
request.getSession().setAttribute("basicList", basicList);
biz:
public List findAllBasicDataByNoteId(int noteId) {
String hql = "from BasicData where 1=1";
//noteId 值为大于等于0时,根据上级目录ID查询
if(noteId>=0){
hql+=" and noteId ="+noteId;
}
return super.getBaseDao().findObject(hql);
}dao:
public List findObject(String hql) {
try {
return super.getHibernateTemplate().find(hql);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
把hql 改成sql 放到数据库里查询 1000++数据也是一瞬间, 我用hql又添加了where条件只查询50条数据,可以还是用了大概6——7秒的样子。
就向你说的,数据库表之间的关联的确比较多,关联多了,影响很大吗? 谢谢!
呵呵,我的意思不是让你把HQL改成SQL,而是在将HIBERANTE 将该HQL转换出的SQL(打印在控制台)的语句加上参数跑下。不过这没关系,已经运行了,也就是说你的HQL查询慢,并不是由这句HQL引起的,而是由你的HIBERNATE 映射配置文件导致的。看了先你的表外键,确实多。那么你应该先确定下,
1、这些外键关系是否都要在hibernate的映射配置文件中配置多对一,一对多关系!
2、其次,你要考虑哪些外键对应的表数据时需要在当前你要执行的HQL语句中同时将数据查出来的。如果此处的HQL不需要在查主表的时候将关联表的数据同时取出来,那么你可以不用将这些外键作为表对象声明在主表对象中,只是把这些外键作为单纯的表属性来配置(也就是不配置关联关系)。那么你可以在需要关联表数据的时候,通过主表对象获取该外键,然后再进行一次关联表查询。当然你也可以值配置部分外键映射关系(经常用到的),同时使用延迟加载,这样可以减轻这条HQL查询速度(因为不用查找不必要使用的数据)。
使用HIBERNATE是,优势就是关联关系。当然要根据业务来确定。当不需要在获取主表对象时也获取关联表对象时,可以将外键配置成单村的属性,而不进行映射,而只是在使用的时候再去数据库查询。同时结合延迟加载,避免没有使用数据时进行额外的查询语句。向你这种外键比较多的表设计,使用hibernate时,还是部分的考虑手工维护表主外键约束比较好,这种关联关系过于复杂的表间映射关系,不适合用hibernate的自动映射管理。
谢谢你的建议,非常感谢! 之前同学说他们的项目(也是SSH),只在数据库中加关系,但在hibernate中又都把关系去掉了,操作多个表的时候就拼sql。 当时我感觉用hibernate关联映射挺好的,显示的时候,只要'.'(点)一下就出来,现在感觉 他们的做法应该是对的。
别人提醒了,有时候还是不信,只有自己遇到了,才能体会的更深刻。牛牛哥,谢谢了!
我是把 hql 复制到 数据库 ,然后改成sql 的