數據庫大量數據操作中事務優化方案

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("每日清理歷史不用報價信息,任務結束。");

    }


}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章