用spring+hibernate写的程序,目的:从3万多条数据中找出符合某种条件的所有数据的某个字段,然后用“,”把所有字段连接起来,在程序中读去数据非常的慢,请教各位大虾,程序是否有办法提高查询速度?(我已加了索引,在数据库中查询很快)
代码: public String getRecommendNumbers() {  //获取未被推荐的手机号码
String strRandomNums = ""; 
try{
List list = this.getHibernateTemplate().find("from MobileNum mobileNum where mobileNum.recommendTimes<=3 and mobileNum.alreadyAnswered=0");

for(int i=0; i< list.size(); i++){
strRandomNums += ((MobileNum)list.get(i)).getNumber()+",";  }
}catch(Exception e){
log.debug(e.getMessage());
}
return strRandomNums;
}

解决方案 »

  1.   

    毫无凝问,大数据量,使用JDBC单独处理。在SPRING下,使用JDBC也很方便。
      

  2.   


    你的读取速度慢,问题不是数据库或者 hibernate,而是出在你自己程序上面:
    strRandomNums += ((MobileNum)list.get(i)).getNumber()+",";
    这一行中,每次都要 new 信得 String 对象,效率不低才怪!
    建议使用 java.lang.StringBuffer 类
      

  3.   


    STRING对象影响不大。问题不在这里。关键还是框架问题,批量处理数据库,一定要不能用框架,用JDBC.
      

  4.   

    2楼讲的非常有道理,确实如此,我试用了StringBuffer后快了很多。俺是菜鸟,谢谢2楼指导!1楼和3楼讲的对我以后开发都有帮助,也非常感谢你们的指导。只是本人现在的项目已经是用hibernate框架搭建开发的,而已时间比较急,若要改成JDBC,可能已来不急了!
      

  5.   


    别的不多说,不要把什么问题都推到框架方面
    你用不好就别说 hibernate 不好用楼主去运行一下下面这个小程序就知道问题出在哪里了:package com.defonds.test;import java.util.Date;public class Test { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    Date date0 = new Date();
    int i,j;
    String test0 = "",test1 = "";
    StringBuffer buffer = new StringBuffer("");
    for(i = 0;i < 10000;i ++) {
    test0 = test0 + i;
    }
    Date date1 = new Date();
    System.out.println("String + 耗用时间:" + (date1.getTime() - date0.getTime()));
    Date date2 = new Date();
    for(j = 0;j < 10000;j ++) {
    buffer.append(i);
    }
    Date date3 = new Date();
    System.out.println("StringBuffer + 耗用时间:" + (date3.getTime() - date2.getTime()));
    }}
      

  6.   

    list.size()有多大啊,打的话,字符串拼接就影响效率。
    上面说的对,用StringBuffer
      

  7.   


    你们说的非常精确,确实是在String和StringBuffer运用上的出了问题。小弟获益非浅,谢谢各位指导!
      

  8.   

    本人把代码改为这样后,已经能很快了。
    public String getRecommendNumbers() {  //获取未被推荐的手机号码
    //String strRandomNums = ""; 
    StringBuffer strBuf = new StringBuffer();
    try{
    List list = this.getHibernateTemplate().find("from MobileNum mobileNum where mobileNum.recommendTimes<=3 and mobileNum.alreadyAnswered=0");

    for(int i=0; i< list.size(); i++){
    strBuf.append(((MobileNum)list.get(i)).getNumber()+",");
    //strRandomNums += ((MobileNum)list.get(i)).getNumber()+","; 
    }
    }catch(Exception e){
    log.debug(e.getMessage());
    }
    return strBuf.toString();
    }
      

  9.   

    把String改为StringBuffer后,问题似乎解决了
      

  10.   

    大批量查询的话,hibernate效率是相当低的
      

  11.   

    hibernate有批量处理方式吧。。
      

  12.   

    做大量字符串相加时 别用String 用StringBufferstrRandomNums += ((MobileNum)list.get(i)).getNumber()+",";
    改为StringBuffer sb = new StringBuffer();sb .append(((MobileNum)list.get(i)).getNumber()+",");
      

  13.   

    在hibernate里面加入SQL语句,感觉比直接用JDBC还要简单,呵呵,楼主可以试试。
      

  14.   

    其实,如果只是为了插入大量的数据,用hibernate的速度不如直接用jdbc,其实你不需要全部都改成jdbc,你只需要在插入大量数据的地方直接获取一个jdbc的链接来执行批量查询就可以了,可以快很多的
      

  15.   

    string操作频繁,请用StringBuffer
    循环时请先取出容器的size,别在for循环里执行n遍。
    hibernate本身就不是为性能而来的,所以对于jdbc通常没有什么性能上的优势,但是配置上如果注意关联和关系维护策略的配置及使用缓存且配置正确,性能还是不错的,反之如果配置不当性能会很糟糕。