在订单中心处理订单,总会遇到大批量订单处理的业务,下面就将如何大批量处理数据来提高效率做一个总结;
代码设计:在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>