如何提高hibernate查询大数据量的速度?

jadewoo 2009-07-24 12:13:18
用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;
}
...全文
1173 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
loaferwang 2009-10-23
  • 打赏
  • 举报
回复
不错,不错呀
sally-wang 2009-07-28
  • 打赏
  • 举报
回复
讲得不错,学习学习
haoziheyezi 2009-07-28
  • 打赏
  • 举报
回复
讲得都很不错

学习了
dinghun8leech 2009-07-28
  • 打赏
  • 举报
回复
string操作频繁,请用StringBuffer
循环时请先取出容器的size,别在for循环里执行n遍。
hibernate本身就不是为性能而来的,所以对于jdbc通常没有什么性能上的优势,但是配置上如果注意关联和关系维护策略的配置及使用缓存且配置正确,性能还是不错的,反之如果配置不当性能会很糟糕。
supreme1008 2009-07-26
  • 打赏
  • 举报
回复
其实,如果只是为了插入大量的数据,用hibernate的速度不如直接用jdbc,其实你不需要全部都改成jdbc,你只需要在插入大量数据的地方直接获取一个jdbc的链接来执行批量查询就可以了,可以快很多的
code_killer 2009-07-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jadewoo 的回复:]
2楼讲的非常有道理,确实如此,我试用了StringBuffer后快了很多。俺是菜鸟,谢谢2楼指导!

1楼和3楼讲的对我以后开发都有帮助,也非常感谢你们的指导。只是本人现在的项目已经是用hibernate框架搭建开发的,而已时间比较急,若要改成JDBC,可能已来不急了!
[/Quote]


在hibernate里面加入SQL语句,感觉比直接用JDBC还要简单,呵呵,楼主可以试试。
zl3450341 2009-07-26
  • 打赏
  • 举报
回复
学习了
hui94781674 2009-07-26
  • 打赏
  • 举报
回复
受益了。
_Nick_ 2009-07-26
  • 打赏
  • 举报
回复
做大量字符串相加时 别用String 用StringBuffer

strRandomNums += ((MobileNum)list.get(i)).getNumber()+",";
改为

StringBuffer sb = new StringBuffer();

sb .append(((MobileNum)list.get(i)).getNumber()+",");
FoxOnWeb 2009-07-26
  • 打赏
  • 举报
回复
hibernate有批量处理方式吧。。

java91 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 defonds 的回复:]
引用楼主 jadewoo 的回复:
用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;
}


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

STRING对象影响不大。问题不在这里。关键还是框架问题,批量处理数据库,一定要不能用框架,用JDBC.
Defonds 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用楼主 jadewoo 的回复:]
用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;
}
[/Quote]

你的读取速度慢,问题不是数据库或者 hibernate,而是出在你自己程序上面:
strRandomNums += ((MobileNum)list.get(i)).getNumber()+",";
这一行中,每次都要 new 信得 String 对象,效率不低才怪!
建议使用 java.lang.StringBuffer 类
java91 2009-07-24
  • 打赏
  • 举报
回复
毫无凝问,大数据量,使用JDBC单独处理。在SPRING下,使用JDBC也很方便。
sangshusen_1988 2009-07-24
  • 打赏
  • 举报
回复
大批量查询的话,hibernate效率是相当低的
xlxyeyu 2009-07-24
  • 打赏
  • 举报
回复
受益!
jadewoo 2009-07-24
  • 打赏
  • 举报
回复
把String改为StringBuffer后,问题似乎解决了
jadewoo 2009-07-24
  • 打赏
  • 举报
回复
本人把代码改为这样后,已经能很快了。
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();
}
jadewoo 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 defonds 的回复:]
引用 3 楼 java91 的回复:
引用 2 楼 defonds 的回复:
引用楼主 jadewoo 的回复:
用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;
}


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


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


别的不多说,不要把什么问题都推到框架方面
你用不好就别说 hibernate 不好用

楼主去运行一下下面这个小程序就知道问题出在哪里了:

Java codepackage com.defonds.test;import java.util.Date;publicclass Test {/**
*@param args*/publicstaticvoid 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()));
}

}
[/Quote]

你们说的非常精确,确实是在String和StringBuffer运用上的出了问题。小弟获益非浅,谢谢各位指导!
Johnson_Hong 2009-07-24
  • 打赏
  • 举报
回复
list.size()有多大啊,打的话,字符串拼接就影响效率。
上面说的对,用StringBuffer
Defonds 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 java91 的回复:]
引用 2 楼 defonds 的回复:
引用楼主 jadewoo 的回复:
用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;
}


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


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

别的不多说,不要把什么问题都推到框架方面
你用不好就别说 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()));
}

}
加载更多回复(1)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧