并发编程实例---批量插入数据
来源:互联网 发布:如何使用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
- 并发编程实例---批量插入数据
- 数据库编程-批量插入数据
- ASP批量插入数据的一个实例
- ibatis批量插入实例
- jdbc批量插入实例
- sql中批量插入数据、char与int拼接实例
- sql中批量插入数据、char与int拼接实例
- codeigniter使用技巧批量插入数据实例方法分享
- 批量保存,批量插入数据
- mongodb批量插入插入数据
- 批量插入数据重复插入
- 批量插入数据集
- asp批量插入数据
- 批量插入数据
- 批量插入数据
- Oracle批量插入数据
- mybatis数据批量插入
- mysql批量插入数据
- android studio中多model造成的问题
- php闭包
- getLocationInWindow和getLocationOnScreen的区别
- PHP5及DiscuzX安装指南
- mysql 千万级数据的删除
- 并发编程实例---批量插入数据
- Refused to execute script from '*' because its MIME type ('text/plain') is not executable
- C++文件读取学习
- android防止按钮多次点击和添加双击事件
- Linux Core Dump浅析
- centos6.8配置jdk7环境及tomcat服务器
- 百度账号选取方案
- 某度实习的前端小白进化史--Homebrewde
- DB2错误信息SQLCODE SQLSTATE (按sqlcode排序)