1 問題描述
當一次性生成大量優惠券時,發現後臺cpu使用率突然很高,無法成功生成券。
2 排查過程
- 發現DAO層的Mapper.xml配置檔案中,插入的SQL配置如下:【不正常】
<insert id="batchInsert" useGeneratedKeys="true" keyProperty="id" parameterType="java.util.List">
<foreach collection="list" item="model" separator=",">
insert into promotion_coupon_user (id,template_id, coupon_id...)
values
(#{model.id},#{model.templateId}, #{model.couponId}...
</foreach>
</insert>
複製程式碼
- 上層應用程式插入優惠券一次性插入50W+條資料,沒有做資料插入切分;【不正常】
3 解決問題
- 修改DAO層的Mapper.xml配置檔案中,插入的SQL:
<insert id="batchInsert" useGeneratedKeys="true" keyProperty="id" parameterType="java.util.List">
insert into promotion_coupon_user (id,template_id, coupon_id...)
values
<foreach collection="list" item="model" separator=",">
(#{model.id},#{model.templateId}, #{model.couponId}...
</foreach>
</insert>
複製程式碼
- 修改上層應用,資料量大時,一定要進行資料切割插入;
4 問題總結
- 為了提升效率,資料能一次提交不做多次提交;
- 能一次插入解析sql不要多次提交解析sql;
- 插入資料量太大時,需要程式預先切割資料;