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

原创 2017年01月03日 11:53:10
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>



版权声明:本文为博主原创文章,未经博主允许不得转载。

JAVA 8 并发增强 (4) ConcurrentHashMap批量操作

/* * java8为并发哈希映射提供了批量操作数据操作,即使在其他线程同时操作映射时也可以安全的执行。 * 批量数据操作会遍历映射并对匹配的元素进行操作。在批量操作过程中,不需要冻结映射...
  • kkgbn
  • kkgbn
  • 2016年08月09日 17:10
  • 1360

MyBatis使用Map批量插入数据的一个例子

直接上代码把,利用面向对象的思想,应该不难理解。 /** * 批量记录错误语言检查错误信息 * * @param languageToolResultBean ...
  • lw_power
  • lw_power
  • 2015年03月16日 20:47
  • 6351

用SQL批量插入数据示例

插入数据:declare @i intset @i=0while (@ibegin insert into T_Cashiers (StatID,CashID,Name,CardNo,Pwd,stat...
  • shshdxx
  • shshdxx
  • 2008年04月25日 09:40
  • 192

并发编程经典实例

  • 2017年10月14日 23:39
  • 10.79MB
  • 下载

高并发程序设计入门

说在前面本文绝大部分参考《JAVA高并发程序设计》,类似读书笔记和扩展。走入并行世界概念同步(synchronous)与异步(asynchronous)同步和异步通常来形容一次方法调用。同步方法调用一...
  • johnstrive
  • johnstrive
  • 2016年02月24日 08:39
  • 25787

java hbase api 批量高效写入数据(线程池方式)

笔者尝试各种方法写入HBase,其中使用线程池方式写入数据最为快速。测试环境:hbase 1.2.4, hadoop 2.7 单条数据大小1kb,7台服务器24核48g内存千兆网卡,测试1000w数据...
  • jack85986370
  • jack85986370
  • 2017年01月05日 22:53
  • 9721

批量导入大数据表的时候 使用线程池处理

public class UpdateMebinfoThread implements Runnable{ private int beginnum= 0;// 开始行数 privat...
  • u011984596
  • u011984596
  • 2017年01月16日 10:14
  • 399

rose框架

rose是什么? 基于IoC容器 (使用Spring 2.5.6).收集最佳实践,形成规范和惯例,引导按规范惯例,简便开发.收集通用功能,形成一些可使用的组件,提高生产效率.特性的插拔,使用基于组合...
  • feir23
  • feir23
  • 2016年05月03日 13:10
  • 614

关于数据并发

当多个用户同时更新同一数据的时候,由于更新可能导致数据的不一致性,使得程序的业务数据发生错误,这种情况可以称之为并发。在ADO .NET中,并发的处理可以通过三种方式来控制:保守式并发控制、开发式并发...
  • hougelou
  • hougelou
  • 2017年04月24日 18:42
  • 103

并发访问数据可能存在的问题

读书笔记
  • HaiPaner
  • HaiPaner
  • 2015年10月02日 22:41
  • 173
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:并发编程实例---批量插入数据
举报原因:
原因补充:

(最多只允许输入30个字)