Mybatis Plus 批量插入效率不如自己切分后的并行流

55 阅读1分钟
@Autowired
private UserMapper userMapper;

@Autowired
private UserService userService;


/**
 * 生成10万个User
 */
private List<User> generateUsers(int start ,int end) {
    List<User> users = new ArrayList<>(end-start+1);
    for (int i = start; i <=end; i++) {
        User user = new User();
        user.setId((long) i);
        user.setGender(GenderEnum.MALE);
        user.setName("张三" + i);
        user.setAge(20);
        user.setEmail("哈哈哈@qq.com");
        user.setCreateTime(LocalDateTime.now());
        users.add(user);
    }
    return users;
}


/**
 * 添加用户
 */
@PostMapping("/add1")
public String add1() {
    userService.remove(null);

    String time=null;
    List<User> users1 = generateUsers(0,99999);
    List<User> users2 = generateUsers(100000,199999);
    List<User> users3 = generateUsers(200000,299999);
    System.out.println("users.size() = " + users1.size());
    //开始时间;
    long start = System.currentTimeMillis();
    userService.saveBatch(users1);
    //结束时间
    long end = System.currentTimeMillis();
    System.out.println("耗时1:" + (end - start) + "ms");
    time="耗时1:" + (end - start) + "ms";

    //开始时间;
    long start1 = System.currentTimeMillis();
    //用CompletableFuture.runAsync()来异步执行任务并返回CompletableFuture
    Util.splitList(users2, 2000).stream().map(e->CompletableFuture.runAsync(()->
                    userService.saveBatch(e))).collect(Collectors.toList())
            .forEach(CompletableFuture::join);
    //结束时间
    long end1 = System.currentTimeMillis();
    System.out.println("耗时2:" + (end1 - start1) + "ms");
    time=time+"  耗时2:" + (end1 - start1) + "ms";

    //开始时间;
    long start2 = System.currentTimeMillis();
    Util.splitList(users3, 1000).parallelStream().forEach(userService::saveBatch);
    //结束时间
    long end2 = System.currentTimeMillis();
    System.out.println("耗时3:" + (end2 - start2) + "ms");
    time=time+"  耗时3:" + (end2 - start2) + "ms";

    return time;


}

image.png

image.png