public String downnew() throws Exception{
int total = downManager.get_total();//error=0数据个数
int p=total/1000;
/*if(p%1000>0)
p=p+1;*/

System.out.println("开始执行down导入程序");
System.out.println("total:"+String.valueOf(total));
System.out.println("p:"+String.valueOf(p));
int i=base;
try {
for(int pp=0;pp<p;pp++){
List<Down> listdown = downManager.getDown_news(pp*1000);
for(Down d :listdown){
Integer fid=d.getFid();
Integer zid=d.getZid();
String chapter=d.getChapter();
String type=d.getType();
Date downtime=d.getTime();
boolean error=d.isError(); Downnew d_new=new Downnew();
d_new.setFid(fid);
d_new.setZid(zid);
d_new.setChapter(chapter);
d_new.setType(type);
d_new.setTime(downtime);
d_new.setError(error);
try{
hibernateDao.save(d_new);
System.out.println("i:"+String.valueOf(++i));
}catch (Exception e) {
e.printStackTrace();
}
}
}
}catch (Exception e) {
e.printStackTrace();
}

System.out.println("----------------------------开始执行down导入程序完成-----------------------------------------------");
return "input";

}/**
 * 获取down列表error=0的前面100个数据----调试用
 * @param i :结果集的第i条开始获取
 */
public List<Down> getDown_news(Integer i){
return super.createCriteria(Down.class)
.add(Restrictions.eq("error", false))
.setFirstResult(i)
.setMaxResults(1000)
.list();
}mysql数据库
这里是查询获取的数据很大,所以想到了先循环,然后分页来查询的方法,但是随着外循环次数的的增加,单次循环的时间也增加了,即p越大,每次循环的时间就越大这个这么优化啊?
Hibernate优化sql

解决方案 »

  1.   

    个人认为你这个程序片段查询时没有问题的,反正所有记录都要获取一次。而是把数据转换为Downnew对象然后保存的时候可以优化一下,采用PreparedStatment批量添加。
      

  2.   


    话说我直接设置total值,5000和50000没次循环的速度差蛮多
      

  3.   

    total = p * m; 每次查询多少个,你自己去尝试。  肯定需要循环,我也不确定那个数值最好,但是保存那里肯定可以优化