分布式-数据批量新增数据库
0.pojo
package com.mall.order.pojo;
import org.apache.commons.lang3.builder.ToStringBuilder;
import javax.persistence.*;
import java.io.Serializable;
import java.lang.Long;
import java.util.Date;
import java.lang.String;
import java.lang.Integer;
@Table(name="order_item_details")
public class OrderItemDetails implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "order_no")
private String orderNo;
@Column(name = "order_time")
private Date orderTime;
@Column(name = "finish_time")
private Date finishTime;
@Column(name = "total_price")
private String totalPrice;
@Column(name = "sku_id")
private Long skuId;
@Column(name = "item_name")
private String itemName;
@Column(name = "sku_num")
private Integer skuNum;
@Column(name = "brand_name")
private String brandName;
@Column(name = "policy_attributes")
private String policyAttributes;
@Column(name = "is_jieneng")
private String isJieneng;
@Column(name = "is_huanbao")
private String isHuanbao;
@Column(name = "is_prison_enter")
private String isPrisonEnter;
@Column(name = "order_type")
private String orderType;
@Column(name = "purchasing_zone")
private String purchasingZone;
@Column(name = "legal_entity_organization_name")
private String legalEntityOrganizationName;
@Column(name = "buyer_id")
private Long buyerId;
@Column(name = "buyer_name")
private String buyerName;
@Column(name = "supplier_id")
private Long supplierId;
@Column(name = "supplier_name")
private String supplierName;
@Column(name = "service_attitude_rating")
private Integer serviceAttitudeRating;
@Column(name = "package_quality_rating")
private Integer packageQualityRating;
@Column(name = "arrival_speed_rating")
private Integer arrivalSpeedRating;
@Column(name = "process_effective_rating")
private Integer processEffectiveRating;
@Column(name = "satisfaction_level_rating")
private Integer satisfactionLevelRating;
@Column(name = "service_overall_rating")
private String serviceOverallRating;
@Column(name = "satisfaction_rating")
private Integer satisfactionRating;
@Column(name = "signin_timely_rating")
private Integer signinTimelyRating;
@Column(name = "paying_timely_rating")
private Integer payingTimelyRating;
@Column(name = "communication_rating")
private Integer communicationRating;
@Column(name = "overall_rating")
private String overallRating;
@Column(name = "remark1")
private String remark1;
@Column(name = "remark2")
private String remark2;
@Column(name = "remark3")
private String remark3;
@Column(name = "remark4")
private String remark4;
@Column(name = "remark5")
private String remark5;
}
1.OrderItemDetailsMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mall.order.mapper.OrderItemDetailsMapper">
<insert id="importOrderItemAssembleDataBatch" parameterType="com.mall.order.pojo.OrderItemDetails"
useGeneratedKeys="true" keyProperty="id">
INSERT INTO order_item_details
(
order_no,
order_time,
finish_time,
total_price,
sku_id,
item_name,
sku_num,
brand_name,
policy_attributes,
is_jieneng,
is_huanbao,
is_prison_enter,
order_type,
purchasing_zone,
legal_entity_organization_name,
buyer_id,
buyer_name,
supplier_id,
supplier_name,
service_attitude_rating,
package_quality_rating,
arrival_speed_rating,
process_effective_rating,
satisfaction_level_rating,
service_overall_rating,
satisfaction_rating,
signin_timely_rating,
paying_timely_rating,
communication_rating,
overall_rating,
remark1,
remark2,
remark3,
remark4,
remark5
)
VALUES
<foreach collection="list" item="item" separator="," index="index">
(
#{item.orderNo},
#{item.orderTime},
#{item.finishTime},
#{item.totalPrice},
#{item.skuId},
#{item.itemName},
#{item.skuNum},
#{item.brandName},
#{item.policyAttributes},
#{item.isJieneng},
#{item.isHuanbao},
#{item.isPrisonEnter},
#{item.orderType},
#{item.purchasingZone},
#{item.legalEntityOrganizationName},
#{item.buyerId},
#{item.buyerName},
#{item.supplierId},
#{item.supplierName},
#{item.serviceAttitudeRating},
#{item.packageQualityRating},
#{item.arrivalSpeedRating},
#{item.processEffectiveRating},
#{item.satisfactionLevelRating},
#{item.serviceOverallRating},
#{item.satisfactionRating},
#{item.signinTimelyRating},
#{item.payingTimelyRating},
#{item.communicationRating},
#{item.overallRating},
#{item.remark1},
#{item.remark2},
#{item.remark3},
#{item.remark4},
#{item.remark5}
)
</foreach>
</insert>
</mapper>
2.OrderItemDetailsMapper.java
package com.mall.order.mapper;
import com.mall.order.pojo.OrderItemDetails;
import org.apache.ibatis.annotations.Param;
import tk.mybatis.mapper.common.Mapper;
import java.util.List;
import java.util.Map;
public interface OrderItemDetailsMapper extends Mapper<OrderItemDetails> {
int importOrderItemAssembleDataBatch(@Param("list") List<OrderItemDetails> list);
}
3.OrderItemDetailsServiceImpl.java
void initOrderItemDetailsByfindAssembleData();
@Autowired
private OrderItemDetailsMapper orderItemDetailsMapper;
@Override
public void initOrderItemDetailsByfindAssembleData() {
List<OrderItemDetails> details = null;
int batchNum = 300;
DistributedMultithreading task = new DistributedMultithreading(orderItemDetailsMapper, details, batchNum);
try {
task.invoke();
logger.info("批量添加订单明细数据完成!");
} catch (Exception e) {
e.printStackTrace();
}
return;
}
4.DistributedMultithreading.java
package com.mall.order.service.handler;
import cn.hutool.core.collection.CollUtil;
import com.mall.order.mapper.OrderItemDetailsMapper;
import com.mall.order.pojo.OrderItemDetails;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
public class DistributedMultithreading {
private final static Logger logger = LoggerFactory.getLogger(DistributedMultithreading.class);
private OrderItemDetailsMapper orderItemDetailsMapper;
private List<OrderItemDetails> list;
private int batchNum;
public DistributedMultithreading(OrderItemDetailsMapper orderItemDetailsMapper, List<OrderItemDetails> list, int batchNum) {
this.orderItemDetailsMapper = orderItemDetailsMapper;
this.list = list;
this.batchNum = batchNum;
}
public void invoke() throws Exception {
int totalNum = list.size();
if (totalNum <= batchNum) {
handler(list);
return;
}
batchDeal(list, batchNum);
}
protected void handler(List<OrderItemDetails> handlerList) {
int result = orderItemDetailsMapper.importOrderItemAssembleDataBatch(handlerList);
if (result > 0) {
logger.info("共导入:{}条数据!", result);
List<Long> new_ids = handlerList.stream().map(OrderItemDetails::getId).collect(Collectors.toList());
logger.info("新导入数据的主键id为:{}", new_ids);
}
}
protected void batchDeal(List<OrderItemDetails> data, int batchNum) throws Exception {
int totalNum = data.size();
int pageNum = totalNum % batchNum == 0 ? totalNum / batchNum : totalNum / batchNum + 1;
ExecutorService executor = Executors.newFixedThreadPool(pageNum);
try {
CountDownLatch countDownLatch = new CountDownLatch(pageNum);
List<OrderItemDetails> subData = null;
int fromIndex, toIndex;
int j = 0;
while (j < pageNum) {
fromIndex = j * batchNum;
toIndex = Math.min(totalNum, fromIndex + batchNum);
subData = data.subList(fromIndex, toIndex);
ImportTask task = new ImportTask(subData, countDownLatch);
executor.execute(task);
j++;
}
countDownLatch.await();
} finally {
executor.shutdown();
}
}
public class ImportTask implements Runnable {
private List<OrderItemDetails> handlerList;
private CountDownLatch countDownLatch;
public ImportTask(List<OrderItemDetails> handlerList, CountDownLatch countDownLatch) {
this.handlerList = handlerList;
this.countDownLatch = countDownLatch;
}
@Override
public void run() {
if (CollUtil.isNotEmpty(handlerList)) {
handler(handlerList);
}
countDownLatch.countDown();
}
}
}
4.启动类
package com.mall;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.retry.annotation.EnableRetry;
import tk.mybatis.spring.annotation.MapperScan;
@SpringBootApplication
@MapperScan(value = {"com.mall.order.mapper"})
public class OrderItemDetailsApplication {
public static void main(String[] args) {
SpringApplication.run(OrderItemDetailsApplication.class,args);
}
}