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