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

解决方案 »

  1.   

    一般是你数据库没有commit的,可能会这样子的
      

  2.   

    将打印出来的的SQL语句直接放在数据库中执行下,看是否存在同样的问题。如果存在可以查看下查询计划,分下具体慢到哪了。如果不存在,那么看下你的hibernate配置,比如关联关系什么的,是不是虽然你的意思是只执行一次查询,可实际hibernate框架因为你的设置需要其他额外的查询语句,导致查询慢。这个你可以看下输出SQL是否只有from BasicData where 1=1 还是同时存在其他SQL.
      

  3.   


    把hql 改成sql 放到数据库里查询 1000++数据也是一瞬间, 我用hql又添加了where条件只查询50条数据,可以还是用了大概6——7秒的样子。
    就向你说的,数据库表之间的关联的确比较多,关联多了,影响很大吗? 谢谢!
      

  4.   

    这你还用 hibernate你们项目没资深人员建议不要用hibernate看一下配置文件里面。。配置
      

  5.   


    呵呵,我的意思不是让你把HQL改成SQL,而是在将HIBERANTE 将该HQL转换出的SQL(打印在控制台)的语句加上参数跑下。不过这没关系,已经运行了,也就是说你的HQL查询慢,并不是由这句HQL引起的,而是由你的HIBERNATE 映射配置文件导致的。看了先你的表外键,确实多。那么你应该先确定下,
    1、这些外键关系是否都要在hibernate的映射配置文件中配置多对一,一对多关系! 
    2、其次,你要考虑哪些外键对应的表数据时需要在当前你要执行的HQL语句中同时将数据查出来的。如果此处的HQL不需要在查主表的时候将关联表的数据同时取出来,那么你可以不用将这些外键作为表对象声明在主表对象中,只是把这些外键作为单纯的表属性来配置(也就是不配置关联关系)。那么你可以在需要关联表数据的时候,通过主表对象获取该外键,然后再进行一次关联表查询。当然你也可以值配置部分外键映射关系(经常用到的),同时使用延迟加载,这样可以减轻这条HQL查询速度(因为不用查找不必要使用的数据)。
    使用HIBERNATE是,优势就是关联关系。当然要根据业务来确定。当不需要在获取主表对象时也获取关联表对象时,可以将外键配置成单村的属性,而不进行映射,而只是在使用的时候再去数据库查询。同时结合延迟加载,避免没有使用数据时进行额外的查询语句。向你这种外键比较多的表设计,使用hibernate时,还是部分的考虑手工维护表主外键约束比较好,这种关联关系过于复杂的表间映射关系,不适合用hibernate的自动映射管理。
      

  6.   


    谢谢你的建议,非常感谢! 之前同学说他们的项目(也是SSH),只在数据库中加关系,但在hibernate中又都把关系去掉了,操作多个表的时候就拼sql。    当时我感觉用hibernate关联映射挺好的,显示的时候,只要'.'(点)一下就出来,现在感觉 他们的做法应该是对的。
    别人提醒了,有时候还是不信,只有自己遇到了,才能体会的更深刻。牛牛哥,谢谢了!
      

  7.   

    谁没 Hello World 过啊,需要个过程,谢谢了!
      

  8.   


    我是把 hql 复制到 数据库 ,然后改成sql 的
      

  9.   

    如果你自己写个项目 那没问题。。我是说做项目的时候。。如果你们组最好有个大牛。。不然还是ibatis-----------------------------------------------------------------------现在用的ibatis比较多 呵呵 SQL优化很明显