JDBC-批量操作的行数限制

来源:互联网 发布:射钉枪子弹淘宝买不了 编辑:程序博客网 时间:2024/05/20 09:44

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();
                     }
   }

 

 

 

原创粉丝点击