并发编程实例---批量插入数据

来源:互联网 发布:如何使用java框架 编辑:程序博客网 时间:2024/06/17 07:05
public class SaveCouponNoTask implements Runnable {  private Logger logger = LogManager.getLogger(SaveCouponNoTask.class);  private ICouponTemplateBiz couponTemplateBiz;  private CountDownLatch latch;  private String sql;  private List<String> params; // 本线程处理的参数列表  public SaveCouponNoTask(CountDownLatch latch, String sql, List<String> params) {    this.couponTemplateBiz = SpringContextHolder.getBean("couponBiz");    this.latch = latch;    this.sql = sql;    this.params = params;  }  @Override  public void run() {    try {      int each = 10000;      int times = Double.valueOf(Math.floor(params.size() / each)).intValue();      int totalCount = 0;      for (int i = 0; i < times; i++) {        int beforeCount = totalCount;        totalCount += each;        System.out.println("线程开始执行,ID:" + Thread.currentThread().getId() + ",当前时间:" + System.currentTimeMillis());        couponTemplateBiz.batchInsertCoupon(sql, params.subList(beforeCount, totalCount));        System.out.println("线程ID:" + Thread.currentThread().getId() + ",当前时间:" + System.currentTimeMillis());      }      if (totalCount < params.size()) {        couponTemplateBiz.batchInsertCoupon(sql, params.subList(totalCount, params.size()));      }    } catch (Exception e) {      logger.error("生成券插入数据库异常", e);    } finally {      latch.countDown();    }  }}


private int generateCouponByActivityId(PromotionActivityListVo promotionActivityListVo, final int nums) {    try {      String sql = generateSimpleInsertCouponSql(promotionActivityListVo);      List<String> params = new ArrayList<String>();      List<String> couponNos = couponTemplateDao.getCouponNoByPromotionId(promotionActivityListVo.getId());      Set<String> couponVoSet = new HashSet<String>(couponNos.size());      for (String counponNo : couponNos) {        couponVoSet.add(counponNo);      }      int i = 0;      while (i < nums) {        String couponNo = promotionActivityListVo.getCouponCode() + com.szy.utils.RandomStringUtils.getRandomString(4);        boolean compareFlag = couponVoSet.contains(couponNo);        if (compareFlag == false) {          i++;          params.add(couponNo);          couponVoSet.add(couponNo);        }      }      if (params.size() > 0) {        int[] indexs = getIndexForSubList(params.size(), 1000, 10);        CountDownLatch latch = new CountDownLatch(indexs.length - 1);        for (int j = 1; j < indexs.length; j++) {          taskExecutor              .execute(new SaveCouponNoTask(latch, sql, params.subList(indexs[j - 1], indexs[j])));        }        new StatCouponNoSaveTask(latch, System.currentTimeMillis()).doTask();        return params.size();      }    } catch (Exception e) {      log.error(e);      return 0;    }    return 0;  }

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"><!-- 核心线程数 --> <property name="corePoolSize" value="1" /><!-- 最大线程数 -->  <property name="maxPoolSize" value="2" /><!-- 队列最大长度 --><property name="queueCapacity" value="10" /><!-- 线程池维护线程所允许的空闲时间,默认为60s --><property name="keepAliveSeconds" value="10" /></bean>



0 0