jOOQ - 寻求有关从 CSV 快速插入的建议

Posted

技术标签:

【中文标题】jOOQ - 寻求有关从 CSV 快速插入的建议【英文标题】:jOOQ - Seeking suggestion regarding fast insertion from CSV 【发布时间】:2020-08-27 11:51:45 【问题描述】:

我正在使用以下代码在 Oracle 中使用 jOOQ 插入来自大型 csv(100,000 条记录)的记录。 这是sn-p:

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 bulk insertion performance issues when loading from CSV; how do I improve the process?

但是,我的用例有点不同,所以问这个只是为了得到一个建议,我是否以正确的方式做这件事?

另外,您能否建议,jOOQ 中的 batchInsert(..) 实现是否支持批处理执行? (在文档中,我看到了 .bind(..) 方法,所以为了清楚起见询问)

【问题讨论】:

【参考方案1】:

jOOQ 有一个开箱即用的 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();

它让您可以方便地指定批量/批量/提交大小和其他行为。我建议你使用它。

【讨论】:

如果我们想添加一个额外的列并明确设置它的值怎么办。例如,CSV 中没有给出 BOOK.CREATOR,但我们还想为 BOOK.CREATOR 设置一个已知值,因为表中需要此列。在此 API 中添加额外的列的任何方式? 这还不能开箱即用:github.com/jOOQ/jOOQ/issues/4941。但是,如果您使用一个 CSV 库,它可以在将输入流传递给 jOOQ 之前对其进行预处理并将数据附加到其中,则相对容易...... @AnmolDeora:这将在 jOOQ 3.14 中通过github.com/jOOQ/jOOQ/issues/10583 和github.com/jOOQ/jOOQ/issues/4941 得到支持

以上是关于jOOQ - 寻求有关从 CSV 快速插入的建议的主要内容,如果未能解决你的问题,请参考以下文章

寻求有关 Oracle 数据密集型应用程序的建议

寻求有关项目的建议。解析逻辑表达式

寻求有关构建图形控件的最佳方法的建议

使用 jOOQ 使用正确的类型转换从 values() 中选择插入

JOOQ 插入记录列表

如何在使用 jooq 生成的 dao 插入/更新后获取插入/更新的对象