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(i%1000==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(i%1000==0){

                  //提交批

                  st.executeBatch();

                  st.clearBatch();

              }

           }

           st.executeBatch();

           st.clearBatch();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值