Java中大量数据批量处理方式

在订单中心处理订单,总会遇到大批量订单处理的业务,下面就将如何大批量处理数据来提高效率做一个总结;

代码设计:在dao层写批量新增的方法。以及实现dao的实现类,在service调用这个dao就可以了,不过最终走的还是单个只不过是集合的遍历。

IOrderBatchDao

public interface IOrderBatchDao {  
    /** 
     * 保存多条记录 
     *  
     * @param orders: 
     */  
    void saveAll(List<Order> orders);  

    /** 
     * 批量更新记录 
     * @param orders:
     */  
    void batchUpdate(List<Order> orders);  

    /** 
     * 批量删除 
     * @param orders
     */  
    void batchDelete(List<Order> orders);  


}  

dao的实现类:

@Repository("orderBatchDao ")  
public class OrderBatchDaoImpl implements  
        IOrderBatchDao {  
    static Logger logger = LogManager.getLogger(OrderBatchDaoImpl .class);  

    @Resource(name = "reconTransBaseSqlSessionTemplate")  
    private SqlSessionTemplate sqlSessionTemplate;  

    @Override  
    public void saveAll(List<Order> orders) {  
        SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);  
        IOrderBatchDao dao = session.getMapper(IOrderBatchDao .class);  
        int size = orders.size();  
        try {  
            for (int i = 0; i < size; i++) {  
                dao.save(orders.get(i));  
                if (i % 1000 == 0 || i == size - 1) {  
                    //手动每1000个一提交,提交后无法回滚  
                    session.commit();  
                    //清理缓存,防止溢出  
                    session.clearCache();  
                }  
            }  
        } catch (Exception e) {  
            logger.error("批量保存失败:" ,e);  
            session.rollback();  
        } finally {  
            session.close();  
        }  
    }  

    @Override  
    public void batchUpdate(List<Order> orders) {  
        SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);  
        IOrderBatchDao dao = session.getMapper(IOrderBatchDao .class);  
        int size = orders.size();  
        try {  
            for (int i = 0; i < size; i++) {  
                dao.update(orders.get(i));  
                if (i % 500 == 0 || i == size - 1) {  
                    //手动每500个一提交,提交后无法回滚  
                    session.commit();  
                    //清理缓存,防止溢出  
                    session.clearCache();  
                }  
            }  
        } catch (Exception e) {  
            session.rollback();  
        } finally {  
            session.close();  
        }  
    }  

    @Override  
    public void batchDelete(List<Order> orders) {  
        SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);  
       IOrderBatchDao dao = session.getMapper(IOrderBatchDao .class);  
        int size = orders.size();  
        try {  
            for (int i = 0; i < size; i++) {  
                dao.delete(orders.get(i).getOrderId());  
                if (i % 1000 == 0 || i == size - 1) {  
                    //手动每1000个一提交,提交后无法回滚  
                    session.commit();  
                    //清理缓存,防止溢出  
                    session.clearCache();  
                }  
            }  
        } catch (Exception e) {  
            session.rollback();  
        } finally {  
            session.close();  
        }  
    }  

}  

使用的时候只需要在service里面调用dao就可以了。

对于批量新增, 也可以在mapper.xml中配置方法, 实现批量新增。

<insert id="saveAll" parameterType="java.util.List">  
        INSERT INTO order(last_name,email,gender,d_id)  
        VALUES   
        <foreach collection="order" item="order" separator=",">  
            (#{order.lastName},#{order.email},#{order.gender},#{order.dept.id})  
        </foreach>  
</insert> 
  • 4
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值