用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;
}
代码: 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;
}
你的读取速度慢,问题不是数据库或者 hibernate,而是出在你自己程序上面:
strRandomNums += ((MobileNum)list.get(i)).getNumber()+",";
这一行中,每次都要 new 信得 String 对象,效率不低才怪!
建议使用 java.lang.StringBuffer 类
STRING对象影响不大。问题不在这里。关键还是框架问题,批量处理数据库,一定要不能用框架,用JDBC.
别的不多说,不要把什么问题都推到框架方面
你用不好就别说 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()));
}}
上面说的对,用StringBuffer
你们说的非常精确,确实是在String和StringBuffer运用上的出了问题。小弟获益非浅,谢谢各位指导!
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();
}
改为StringBuffer sb = new StringBuffer();sb .append(((MobileNum)list.get(i)).getNumber()+",");
循环时请先取出容器的size,别在for循环里执行n遍。
hibernate本身就不是为性能而来的,所以对于jdbc通常没有什么性能上的优势,但是配置上如果注意关联和关系维护策略的配置及使用缓存且配置正确,性能还是不错的,反之如果配置不当性能会很糟糕。