Java中大量資料批量處理方式
阿新 • • 發佈:2019-02-03
在訂單中心處理訂單,總會遇到大批量訂單處理的業務,下面就將如何大批量處理資料來提高效率做一個總結;
程式碼設計:在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>