数据库大量数据操作中事务优化方案

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("每日清理历史不用报价信息,任务结束。");

    }


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春风化作秋雨

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值