数据复制效率问题
我们公司用的sqlservlet2000数据库.需要把远端的一个数据库的一个表里的记录(大约3万条)必须通过java程序复制到我们本地的一个数据库表里.我们做了一个程序.但是整个过程需要30分钟.如果等到这个时间的话,session都无效了.特郁闷!代码如下:
/********取处上大远程数据开始*********************/
public static boolean getSDdata(){
log.info( "get sddata begin! ");
boolean result=false ;
/***上大项目读取数据**/
try {
List list = getStudentBaseInfoService().getStudentBaseInfoList( "select * from StudentBaseInfo order by dept_Id ");
com.ins.util.StringToDate getdate=new com.ins.util.StringToDate();
// 清空班级人数。
String sql = "update AdminClass set rs=0, fkrs=0 ";
getSystemDAO().doUpdate(sql);
log.info( "list size = "+list.size());
for(int i=0;i <list.size();i++)
{
log.info( "i= "+i);
StudentBaseInfo stt = (StudentBaseInfo)list.get(i);
//String strinsert = "insert into temptable (name) values( 'ddddd ') ";
String xh = stt.getPersNo().trim();
String xm = stt.getPersName().trim();
Integer intxb = stt.getPersSex().intValue();
String kh = stt.getIcChipNo().trim();
String bjbh = stt.getDeptId().trim();
String bjmc = stt.getDeptName();
String csny = getdate.getString(getdate.getDate(stt.getBirthd())).trim().substring(0,10);
Integer nj = stt.getNj().intValue();
Integer xz = stt.getNz().intValue();
/***以下是向学生表中Insert into DATA BEGIN**/
//第一步 添加院系.
//log.info( "第一步 添加院系 ");
College college = null;
List college1list = (List)getCollegeDAO().findByChinese( "FROM College c where c.yxmc=? ", "上海大学 ");
//log.info( "colloege1 = "+college1list.size());
if(college1list.isEmpty()){
college = new College();
college.setYxbh( "yxbhforsd ");
college.setYxmc( "上海大学 ");
}else{
college = (College)college1list.get(0);
}
getCollegeDAO().save(college);
//第二步 添加班级.
//log.info( "第二步 添加班级 ");
AdminClass adminClass = null;
//log.info( "bjbh===开始 "+i+ "次 "+bjbh);
AdminClass adminClassfind = getAdminClassDAO().findById(bjbh);
if(adminClassfind==null){
//log.info( "第一次加入该班级 ");
adminClass = new AdminClass();
adminClass.setRs(1);//行政班人数加1.
if(!kh.equals( " ") || kh !=null){
adminClass.setFkrs(1);
}
}else{
//int countrs =0,countfkrs=0;//每一次统计人数用。
adminClass = adminClassfind;
adminClass.setRs(adminClassfind.getRs().intValue()+1);//行政班人数加1.
//log.info( "kh= "+kh);
if(!kh.equals( " ") && kh !=null){
adminClass.setFkrs(adminClassfind.getFkrs().intValue()+1);//发卡人数加1.
}
//log.info( "第 "+i+ "次加入该班级 ");
}
//log.info( "发卡人数: "+adminClass.getFkrs()+ "人数: "+adminClass.getRs());
if(adminClass.getFkrs().equals(adminClass.getRs())){
adminClass.setFkzt( "完成 ");
}else{
adminClass.setFkzt( "未完成 ");
}
adminClass.setBjbh(bjbh);
adminClass.setBjmc(bjmc);
adminClass.setNj(nj);
adminClass.setXz(xz);
adminClass.setZt(0);//0在校,1毕业。
adminClass.setCollege(college);
getAdminClassDAO().save(adminClass);
//第三步 添加学生.
//log.info( "第三步 添加学生 ");
Student student = new Student();
student.setXh(xh);
student.setXm(xm);
student.setSex(getSex(intxb));
student.setKh(kh);
student.setCsny(getdate.getDate(csny));
student.setAdminClass(adminClass);
student.setAdr( "无 ");//家庭住址。
student.setMm(xh);
student.setZt(1);//1在校。2毕业。3退学。4毕业。
student.setTnation(getTnation( "01 "));//民族编号
getStudentDAO().save(student);
//log.info( "添加学生完成 ");
/***其它表添加学生相关信息*/
/**体段*/
Checks checks = new Checks();
checks.setStudent(student);
getChecksDAO().save(checks);
log.info( "check save End! ");
/**健康测试*/
TestScore testScore = new TestScore();
log.info( "st.getxh(): "+student.getXh());
testScore.setXh(student.getXh());
testScore.setZtqq(-100);
getTestScoreDAO().save(testScore);
log.info( "TestScore save End! ");
/**体育成绩*/
PeScore peScore = new PeScore();
peScore.setXh(student.getXh());
getPeScoreDAO().save(peScore);
log.info( "PeScore save End! ");
/***以下是向学生表中Insert into DATA END**/
}
//log.info( "添加学生完成 ");
result = true;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
log.info( "get sddata end! ");
return result;
}
/********取处上大远程数据结束*********************/
[解决办法]
你不能分多次,批量提交嗎?控制好一次提交多少筆數據啊,讓session不過期就好了