jOOQ - Запрос предложения по быстрой вставке из CSV

Я использую приведенный ниже код для вставки записей из большого csv (100000 записей) в Oracle с помощью jOOQ. Вот фрагмент:

CSVReader csvReader = null;
    String csvError;
    try {
      csvReader = new CSVReader(new FileReader(tempFile));
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }

    //delete previous uploaded stuff from the same user
    clearTable(user.getUserId());
    List<BSearchRecord> records = new ArrayList<>();
    boolean isFirst = true;
    while (csvReader.hasNext()) {
      if(isFirst) {
        //validate headers
        String[] headers = csvReader.next();
        uploadedHeaders = headers;
        csvError = validateHeadersLength(headers);
        if(csvError != null) {
          return csvError;
        }
        for(int i=0; i<headers.length; i++) {
          csvError = validateEachHeader(i, headers[i]);
          if(csvError != null) {
            return csvError;
          }
        }
        isFirst = false;
        continue;
      } else {
        String[] row = csvReader.next();
        if(row != null) {
          BSearchRecord bSearchRecord = new BSearchRecord();
          bSearchRecord.set(RET_BSEARCH.UPLOADEDBY, user.getUserId());
          for(int i=0; i<csvHeaders.length; i++){
            Field field = bSearchRecord.field(backendColumns[i]);
            bSearchRecord.set(field, row[i]);
          }
          records.add(bSearchRecord);
        }
      }
    }
    db.batchInsert(records).execute(); // IS THIS OKAY ? (is this batch enabled?)

Я наткнулся на несколько предложений, например: Проблемы с производительностью массовой вставки PostgreSQL/JooQ при загрузке из CSV; как мне улучшить процесс?

Однако мой вариант использования был немного другим, поэтому я спрашиваю об этом, чтобы получить предложение, правильно ли я делаю это или нет?

Кроме того, можете ли вы предложить, поддерживает ли реализация batchInsert(..) в jOOQ пакетное выполнение? (в документации я видел подход.bind(..), поэтому прошу это для ясности)

1 ответ

J OOQ имеет готовый API для импорта данных CSV:https://www.jooq.org/doc/latest/manual/sql-execution/importing/importing-csv

ctx.loadInto(BOOK)
   .loadCSV(inputstream, encoding)
   .fields(BOOK.ID, BOOK.AUTHOR_ID, BOOK.TITLE)
   .execute();

Он позволяет вам удобно указывать размеры пакета / пакета / фиксации и дополнительное поведение. Я предлагаю вам использовать это.

Другие вопросы по тегам