jdbc批处理的事务控制

本文介绍了如何在JDBC批处理中实现事务控制,通过关闭自动提交并手动提交事务来确保批处理作为一个整体执行。示例代码展示了如何在处理大量数据时进行分批提交,以防止内存溢出,并在发生异常时进行回滚操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jdbc默认是事务自动提交,每条sql执行都是一个事务,
批处理中也是如此,如果想将批处理作为一个事务处理,则要先关闭事务自动提交,改为手动提交,如下:
String sql = "insert into person(name, age) values (?, ?)";  
        try {  
            conn = getConn();  
            conn.setAutoCommit(false);//关闭自动提交  
            ps = conn.prepareStatement(sql);  
              
            int count = 0;  
            for (Person person : list) {  
                count++;  
                  
                ps.setString(1, person.getName());  
                ps.setInt(2, person.getAge());                
                ps.addBatch();                                          
            }    
            
     int[] c = ps.executeBatch();  
     conn.commit();                                        
     logger.info("提交:" + c.length);
         
            logger.info("总条数:" + count);  
        } catch (Exception e) {  
            e.printStackTrace();  
            logger.error(e.getMessage());  
        } finally {  
            //关闭ps和conn  
        }  

如果数据很多,为防止内存溢出,则需要分批提交,例如2000条提交一次。分批提交代码如下:
ps.addBatch();  
if (count % 2000 == 0 || count == list.size()) {  
    try {  
        int[] c = ps.executeBatch();  
        conn.commit();//这里将每个批次作为一个事务  
        ps.clearBatch();//清除ps中的sql statement  
        logger.info("提交:" + c.length);  
    } catch (Exception e) {  
        logger.error(e.getMessage());  
        conn.rollback();  
    }  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值