code: public void sync(List<Dml> dmls, Function<Dml, Boolean> function) {
          try {
              boolean toExecute = false;
              for (Dml dml : dmls) {
                  if (!toExecute) {
                      toExecute = function.apply(dml);
                  } else {
                      function.apply(dml);
                  }
              }
              if (toExecute) {
                  List<Future<Boolean>> futures = new ArrayList<>();
                  for (int i = 0; i < threads; i++) {
                      int j = i;
                      futures.add(executorThreads[i].submit(() -> {
                          try {
                              dmlsPartition[j].forEach(syncItem -> sync(batchExecutors[j],
                                  syncItem.config,
                                  syncItem.singleDml));
                              dmlsPartition[j].clear();
                              batchExecutors[j].commit();
                              return true;
                          } catch (Throwable e) {
                              batchExecutors[j].rollback();
                              throw new RuntimeException(e);
                          }
                      }));
                  }
  
                  futures.forEach(future -> {
                      try {
                          future.get();
                      } catch (ExecutionException | InterruptedException e) {
                          throw new RuntimeException(e);
                      }
                  });
              }
          } finally {
              for (BatchExecutor batchExecutor : batchExecutors) {
                  if (batchExecutor != null) {
                      batchExecutor.close();
                  }
              }
          }
      }
docs: 批量同步回调
  
  @param dmls 批量 DML
  @param function 回调方法