JDBC-批量操作的行数限制

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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值