如何插入780k记录Spring Data Postgres

时间:2018-06-25 12:53:43

标签: spring-boot java-8 spring-data-jpa spring-data postgresql-9.6

CSV文件将上传到Amazon S3存储桶中。

当前实施:

  1. 使用OpenCSV实用程序的readAll读取CSV文件,该方法返回List
  2. 将每个列值映射到实体对象
  3. 创建一个列表对象(当前大小:: 15000)
  4. 调用Spring Data CRUD存储库saveAll(列表对象)
  5. 在780k条记录中,只有570k条记录保留在数据库中。
  6. 插入这么多记录后,我们看不到任何异常/错误。

绝对不知道之后发生了什么

谷歌搜索后,发现PostgreSQL中的copy命令是将READ / WRITE写入PostgreSQL DB的最快方法。

Java,C,Python等多种语言也支持此功能。

使用PostgreSQL的CopyManager API进行了尝试,该API具有copyIn方法的重载版本。

copyIn(String sql, InputStream is)-由于csv在第一行中包含标题列,因此我们想跳过第一行。

copyIn(String sql, Reader rd)-这不接受CSVReader对象,因为它不是java.io.Reader类型

技术

  • Java 8
  • Spring-Boot 2.0
  • Spring -Data 2.x
  • Spring-JPA 2.x
  • PostgreSQL-9.6

3 个答案:

答案 0 :(得分:2)

我能够找出代码缺陷。 我们提供了db列之一作为“唯一性”约束,而不必这样做,而在CSV文件中,此列有重复的值。因此,记录插入失败。

谢谢, 凤尾鱼

答案 1 :(得分:1)

  

由于我们的csv在第一行中包含标题列,并且我们要跳过第一行,因此我们无法使用它。

这就是COPY ... WITH HEADER的目的。

  

指定文件包含标题行,其中包含文件中每一列的名称。输出时,第一行包含表中的列名,输入时,第一行被忽略。仅当使用CSV格式时,才允许使用此选项。

答案 2 :(得分:0)

  

我们无法使用此代码,因为我们的csv在第一行中包含标题列,并且我们希望跳过第一行。

因此,只需跳过第一行。 copyIn()不会“倒带”它获得的阅读器。您也不需要使用CSVReader。 copy语句将负责解析CSV文件。您需要做的就是提供一个位于应该处理的第一行的阅读器。

大致情况:

CopyManager mgr = new CopyManager(...);

BufferedReader in = new BufferedReader(new FileReader(...));
in.readLine(); // skip the header line

mgr.copyIn("copy target_table from stdin with (...)", in);

确保在copy命令中提供适当的选项,以便可以正确解析文件。