使用Jdbc进行批量处理

Jdbc---使用Jdbc进行批量处理
一    使用目的
      业务场景:当需要向数据库发送一批sql语句执行时,,应避免向数据库一条条的发送执行,而应该采用jdbc的批处理,可以提升执行效率
二    使用批处理分析
1.向数据库中插入多条记录
      public void testBatch() {
            Connection con = null;
            Statement st = null;
            ResultSet rs = null;
 
            try {
                    // 获取连接
                    con = DBManager.getConnection();
                    // 定义sql语句
                    String sql1 = "insert into testbatch values(1,'aaa')";
                    String sql2 = "insert into testbatch values(2,'bbb')";
                    String sql3 = "delete from testbatch where id=1";
                    // 在st对象中有一个集合对象list
                    st = con.createStatement();
                    // 向批中添加sql语句,
                    st.addBatch(sql1);
                    st.addBatch(sql2);
                    st.addBatch(sql3);
                    // 向sql提交批处理,
                    st.executeBatch();
// 得到的是一个int[]整形数组,返回结果是整形数组每一个元素对表格中多少条记录产生影响
                    st.clearBatch();
 
            } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
            } finally {
                    DBManager.release(con, st, rs);
            }
                                                         
                      注:这样通过addBatch()方法可以想数据库中加入多条数据,可以删除数据,同时可以执行多条记录,记住在想sql提交语句的时候要用st.executeBatch();,并且必须在提交之后要清除缓存,但是这个方法只是对数据同时记性几条的插入,如果要是同时插入100条,1000条,10000条,甚至100000条呢??要用到下面的方法
      public void testBatch2() {
            Connection con = null;
            PreparedStatement st = null;
            ResultSet rs = null;
            try {
                    // 获取连接
                    con = DBManager.getConnection();
                    // 定义sql语句
                    String sql = "insert into testbatch values(?,?)";
                    // 创建预处理对象
                    st = con.prepareStatement(sql);
                    //为占位符赋值,100000000会超出内存,抛灾难性的错误,可以把一亿条语句转换为每一千条提交一次
                    //如果多出4条没有被1000整出等于0,在最后再提交一次
                    for(int i =1;i<100000004;i++){
                          st.setInt(1, i);
                          st.setString(2, "aaa"+i);  
                          st.addBatch();
                          if(i00==0){
                                  //提交批
                                  st.executeBatch();
                                  st.clearBatch();
                          }
                    }
                    st.executeBatch();
                    st.clearBatch();
                 
   
            } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
            } finally {
                    DBManager.release(con, st, rs);
            }
           
注:
      通过对下面的两次插入总结出用for循环的方法
                    st.setInt(1, 3);
                    st.setString(2, "aaa");// 已经形成的一条完整的sql语句 (3,"aaa")
 
                    st.addBatch();
 
                    st.setInt(1, 4);
                    st.setString(2, "bbb");// 又形成了第二条完整的sql语句(4,"bbb");
 
                    for(int i =1;i<100000000;i++){
                          st.setInt(1, i);
                          st.setString(2, "aaa"+i);  
                          st.addBatch();   
                          }
                    }
st.executeBatch();
                    st.clearBatch();
            需要注意的是如果一次性的出入100000000个数据,会抛内存溢出的错误,所以可以在每插入1000条提交一次,可以避免内存溢出的错误,代码为:
              for(int i =1;i<100000004;i++){
                          st.setInt(1, i);
                          st.setString(2, "aaa"+i);  
                          st.addBatch();
                          if(i00==0){
                                  //提交批
                                  st.executeBatch();
                                  st.clearBatch();
                          }
                    }
                    st.executeBatch();
                    st.clearBatch();
                 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值