您的位置:首页 > 其它

JDBC-批量操作的行数限制

2012-02-20 15:39 274 查看
1 任务前提

我之前有一个任务,写一段JDBC程序,实现两个不同系统中人员信息的同步,简单说明一下,一个系统中人员表 ASYSEMPTable中7万条数据,通过程序的方法

把这7万数据读出到一个data集合对象中,然后通过这个对象把数据批量插入到另一个系统中人员表empInfo中去。

2 原来的做法和问题

PreparedStatement smst = null;

try {

smst = conn.prepareStatement("insert into empInfo(name,age,addr)values(?,?,?)");

for(int i=0;i<data.getNumRows();i++){

data.setRow(i);

批量插入格式

smst.setString(1, data.getString("cols1"));

smst.setString(2, data.getString("cols2"));

smst.setString(3, data.getString("cols3"));

smst.addBatch();

}

smst.executeBatch();

}

catch(Exception e) {

throw e;

}

finally {

if ( smst != null ) {

smst.close();

}

}

程序顺利执行,没有任何报错,但在empInfo表中只有295条记录,其它的记录莫名奇妙的都没有。

刚开始以为是第296条记录有问题,程序不再插入了,也没有报错。后来删除第296条记录,297条记录,程序没有报错,但大部分的记录还是没有插入进来。

3 问题原因和解决方案

原来jdbc 批量处理 有一个处理最大行数的隐含限制。最大的处理行数是65536条记录。如果超出这个最大行数,程序插入就会出问题。解决的方法是批量分配提交。

PreparedStatement smst = null;

try {

smst = conn.prepareStatement("insert into empInfo(name,age,addr)values(?,?,?)");

for(int i=0;i<data.getNumRows();i++){

data.setRow(i);

批量插入格式

smst.setString(1, data.getString("cols1"));

smst.setString(2, data.getString("cols2"));

smst.setString(3, data.getString("cols3"));

smst.addBatch();

// 批量-分批提交数据 每60000条数据一提交。

if(( i + 1 )%60000==0){

smst.executeBatch();

}

//end

}

// 剩下的10000条记录最后提交。

smst.executeBatch();

}

catch(Exception e) {

throw e;

}

finally {

if ( smst != null ) {

smst.close();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: