贴代码吧,简单封装了一个分批次操作数据的工具类,依赖HutoolLombok,少写几行代码偷偷懒

    1. package org.ssh.boot.pay.util;
    2. import cn.hutool.core.collection.CollUtil;
    3. import cn.hutool.core.thread.ThreadUtil;
    4. import lombok.extern.slf4j.Slf4j;
    5. import java.util.List;
    6. import java.util.concurrent.CompletableFuture;
    7. /**
    8. * 批量处理数据工具类
    9. */
    10. @Slf4j
    11. public class BatchDataUtils {
    12. private final static int BATCH_SIZE = 1000;
    13. /**
    14. * 分批次处理数据 <br>
    15. * 默认每个批次1000条数据
    16. * @param list
    17. * @param handler
    18. * @param <T>
    19. */
    20. public static <T> void batchHandle(List<T> list, BatchHandle<T> handler) {
    21. batchHandle(list, BATCH_SIZE, handler);
    22. }
    23. /**
    24. * 分批次处理数据
    25. * @param list
    26. * @param handler
    27. * @param <T>
    28. * @return
    29. */
    30. public static <T> void batchHandle(List<T> list, int maxSize, BatchHandle<T> handler) {
    31. if (CollUtil.isEmpty(list)) {
    32. return;
    33. }
    34. List<List<T>> splitList = CollUtil.split(list, maxSize);
    35. CompletableFuture<Void> cf = CompletableFuture.runAsync(() -> {
    36. for (List<T> tList : splitList) {
    37. handler.handle(tList);
    38. }
    39. }, ThreadUtil.newExecutor(4, 8));
    40. try {
    41. cf.get();
    42. } catch (Exception e) {
    43. log.error("批量处理数据异常", e);
    44. throw new RuntimeException(e);
    45. }
    46. cf.thenRun(() -> {
    47. log.info("批量处理完成");
    48. });
    49. }
    50. public interface BatchHandle<T> {
    51. void handle(List<T> list);
    52. }
    53. }

    如何使用呢,再贴一段代码。
    这里利用Java8的lambda机制,一行代码实现分批次录入数据

    1. BatchDataUtils.batchHandle(hisReconciliationList, (list) -> hisReconciliationDao.saveAll(list));