jdbc批处理

看下面的方法
Java代码
Connection conn = getConnection();  
        PreparedStatement ps = null;  
        try {  
            conn.setAutoCommit(false);  
            ps = conn.prepareStatement("insert into t_user(username, password) values(?,?)");  
            Random r = new Random();  
            for(int i = 0; i < 1000; i++){  
                ps.setString(1, String.valueOf(r.nextInt(Integer.MAX_VALUE)));  
                ps.setString(2, String.valueOf(r.nextInt()));  
                ps.executeUpdate();  
                [color=red]conn.commit(); //每次都提交[/color]  
            }  
              
        } catch (SQLException e) {  
            conn.rollback();  
            throw e;  
        }finally{  
            ps.close();  
            conn.close();  
        } 

Connection conn = getConnection();
  PreparedStatement ps = null;
  try {
   conn.setAutoCommit(false);
   ps = conn.prepareStatement("insert into t_user(username, password) values(?,?)");
   Random r = new Random();
   for(int i = 0; i < 1000; i++){
    ps.setString(1, String.valueOf(r.nextInt(Integer.MAX_VALUE)));
    ps.setString(2, String.valueOf(r.nextInt()));
    ps.executeUpdate();
    conn.commit(); //每次都提交
   }
   
  } catch (SQLException e) {
   conn.rollback();
   throw e;
  }finally{
   ps.close();
   conn.close();
  }
循环每次都开启一个事务 插入一千条数据 耗时 29078 ms
Java代码
Connection conn = getConnection();  
        PreparedStatement ps = null;  
        try {  
            conn.setAutoCommit(false);  
            ps = conn.prepareStatement("insert into t_user(username, password) values(?,?)");  
            Random r = new Random();  
            for(int i = 0; i < 1000; i++){  
                ps.setString(1, String.valueOf(r.nextInt(Integer.MAX_VALUE)));  
                ps.setString(2, String.valueOf(r.nextInt()));  
                ps.executeUpdate();  
                  
            }  
            conn.commit(); //只提交一次  
        } catch (SQLException e) {  
            conn.rollback();  
            throw e;  
        }finally{  
            ps.close();  
            conn.close();  
        } 

Connection conn = getConnection();
  PreparedStatement ps = null;
  try {
   conn.setAutoCommit(false);
   ps = conn.prepareStatement("insert into t_user(username, password) values(?,?)");
   Random r = new Random();
   for(int i = 0; i < 1000; i++){
    ps.setString(1, String.valueOf(r.nextInt(Integer.MAX_VALUE)));
    ps.setString(2, String.valueOf(r.nextInt()));
    ps.executeUpdate();
    
   }
   conn.commit(); //只提交一次
  } catch (SQLException e) {
   conn.rollback();
   throw e;
  }finally{
   ps.close();
   conn.close();
  }
只开启一次事务  耗时 703 ms
但这不是推荐用法,jdbc有一个批处理方法 专门处理这种批量操作的 ps.addBatch();

Java代码
Connection conn = getConnection();  
        PreparedStatement ps = null;  
        try {  
            conn.setAutoCommit(false);  
            ps = conn.prepareStatement("insert into t_user(username, password) values(?,?)");  
            Random r = new Random();  
            for(int i = 0; i < 1000; i++){  
                ps.setString(1, String.valueOf(r.nextInt(Integer.MAX_VALUE)));  
                ps.setString(2, String.valueOf(r.nextInt()));  
                ps.addBatch();//加入批处理  
                //ps.executeUpdate();不能与addBatch()同时用  
                  
            }  
            int[] results = ps.executeBatch();//执行批处理  
            conn.commit();  
        } catch (SQLException e) {  
            conn.rollback();  
            throw e;  
        }finally{  
            ps.close();  
            conn.close();  
        } 

Connection conn = getConnection();
  PreparedStatement ps = null;
  try {
   conn.setAutoCommit(false);
   ps = conn.prepareStatement("insert into t_user(username, password) values(?,?)");
   Random r = new Random();
   for(int i = 0; i < 1000; i++){
    ps.setString(1, String.valueOf(r.nextInt(Integer.MAX_VALUE)));
    ps.setString(2, String.valueOf(r.nextInt()));
    ps.addBatch();//加入批处理
    //ps.executeUpdate();不能与addBatch()同时用
    
   }
   int[] results = ps.executeBatch();//执行批处理
   conn.commit();
  } catch (SQLException e) {
   conn.rollback();
   throw e;
  }finally{
   ps.close();
   conn.close();
  }

批处理方式 耗时 781 ms

跟只开启一次事务效率差不多

这里要着重指出addBatch()和executeUpdate()不要同时用否则会导致记录插入两次
本来1000条记录 会插入2000条,本人在开始就翻了这个错误

第一种方法与第二 三种方法性能差别达 40倍 看来事务真是性能杀手啊 能少开尽量少开啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值