1、業務場景:
1)短時間內向數據庫中插入大量數據;
2)大批量數據修改操作;
3)批量刪除數據。
2、兩個弊端方案
1、處理完畢後統一提交數據庫;
2、每操作完一條記錄,就提交更新。
3、優化方案:批量事務
1、增加計數標識,記錄已處理數據的量;
2、設定每批處理量的大小;
3、自己控制事務,每達到一定數量,即可提交一次事務,更新至數據庫。
4、優點
1、避免統一提交,對數據庫造成瞬間壓力,從而避免影響其他業務;
2、分批提交,有效減少了數據庫連接次數,降低了數據庫資源的過度消耗。
5、代碼實現
package com.sinosig.job;
import com.sinosig.model.PrecisionPrice;
import com.sinosig.service.credit.CreditsMonthRecordService;
import com.sinosig.service.order.PrecisionPriceService;
import com.sinosig.service.user.UserCreditsService;
import org.apache.commons.lang3.time.DateUtils;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.PersistJobDataAfterExecution;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.quartz.QuartzJobBean;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
/**
* 每月刪除一月前的無用報價信息
* <p/>
* 每月1號2點執行
*
* @author kou
*/
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class ClearHisPricesInfoJob extends QuartzJobBean {
private static final Logger log = LoggerFactory.getLogger(ClearHisPricesInfoJob.class);
@Resource(name = "sessionFactory")
private SessionFactory sessionFactory;
@Resource
CreditsMonthRecordService creditsMonthRecordService;
@Resource
UserCreditsService userCreditsService;
@Resource
private PrecisionPriceService precisionPriceService;
@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
log.info("每日清理歷史不用報價信息,任務開始...");
Date beginTime = DateUtils.addMonths(new Date(), -2);
Date endTime = DateUtils.addMonths(new Date(), -1);
List<PrecisionPrice> list = precisionPriceService.findInvalidData(true, beginTime, endTime);
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
int totalNum = list.size();
// 1、刪除無用險種
for (int i = 0; i < totalNum; i++) {
PrecisionPrice precisionPrice = list.get(i);
String hql = "delete from com.sinosig.model.KindCode where precisionPriceId = ?";
Query q = session.createQuery(hql);
q.setParameter(0, precisionPrice.getId());
q.executeUpdate();
if (i % 40 == 0 || i == totalNum - 1) {
session.flush();
session.clear();
}
}
// 2、刪除無用保險信息
for (int i = 0; i < totalNum; i++) {
PrecisionPrice precisionPrice = list.get(i);
String sql = "delete from b_precision_price where id = ?";
Query q = session.createSQLQuery(sql);
q.setParameter(0, precisionPrice.getId());
q.executeUpdate();
if (i % 40 == 0 || i == totalNum-1) {
session.flush();
session.clear();
}
}
tx.commit();
session.close();
log.info("每日清理歷史不用報價信息,任務結束。");
}
}