[code="java"]
//1、统计一共多少数据
int countNum = jdbcTamplate1.queryForInt("select count(0) from tabA") ;
System.out.println("总记录条数为:"+countNum);
int l = (countNum + 29999) / 30000 ;
jdbcTamplate2.getDataSource().getConnection().setAutoCommit(false) ;
for(int i=0; i<l; i++){
int startRowNum = i * 30000 ;
int endRowNum = (i+1) * 30000 ;
if(i == l-1){
endRowNum = countNum ;
}
//构造查询语句
StringBuilder sql = new StringBuilder() ;
sql.append("select ID, X, Y, from (") ;
sql.append("select rownum r, ID, X, Y from tabA where rownum <= ") ;
sql.append(endRowNum + " ") ;
sql.append("order by ID asc) ") ;
sql.append("where r > ") ;
sql.append(startRowNum) ;
List<Map<String, Object>> rs = jdbcTamplate1.queryForList(sql.toString()) ;
System.out.println((i+1)+"[]获得结果集记录数:"+rs.size());
int[] ns = jdbcTamplate1.batchUpdate(Locrecord.INSERT_SQL, new LocrecordBatchSetter(rs)) ;
System.out.println((i+1)+"[]本次batch记录数:"+ns.length);
jdbcTamplate1.getDataSource().getConnection().commit() ;
Thread.sleep(10000) ;
System.out.println((i+1)+"[]本次循环结束!");
}
jdbcTamplate1.getDataSource().getConnection().setAutoCommit(true) ;
[/code]
其中,Locrecord.INSERT_SQL这个就是简单的insert语句,只插入3个字段,后边的这个LocrecordBatchSetter
也很简单,就是把新表的字段和旧表的字段对应上。比如:
[code="java"]
public void setValues(PreparedStatement pstmt, int i) throws SQLException {
Map<String, Object> obj = list.get(i) ;
pstmt.setString(1, obj.get("ID")+"") ;
pstmt.setInt(2, (obj.get("X")) ;
pstmt.setInt(3, obj.get("Y")) ;
}
[/code]
我是从一个库的表A导数据到另一个库的表B,他们的表结构不一样,只是提出部份可以匹配的字段。
原表有数据73W,我每次导入3W,可是每次循环到21W数据的时候程序就没反应了。也不抛任何异常。控制台显示程序还在进行。
去数据库一看,只有21W数据进入,剩下的就没戏了。想问问用过batch插入的兄弟们。你们碰见过这样的情况吗?
应该如何解决呢?或者使用batch时,还应该注意哪些事情?