如何插入780k记录Spring Data Postgres

问题描述 投票:1回答:3

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

目前的实施:

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

绝对没有任何线索发生在那之后

谷歌搜索后发现PostgreSQL中的copy命令是读取/写入PostgreSQL数据库的最快方法。

Java,C,Python也支持多种语言。

尝试使用PostgreSQL的CopyManager 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
spring-boot java-8 spring-data-jpa spring-data postgresql-9.6
3个回答
2
投票

我能够找出代码缺陷。我们已经提供了一个db列作为Unique约束,它不需要,而在CSV文件中有这个列的重复值。因此,记录插入失败。

Thanx,Fanendra


1
投票

我们不能使用这个,因为我们的csv在第一行包含标题列,我们想跳过第一行。

这就是COPY ... WITH HEADER的用途。

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


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命令中提供适当的选项,以便可以正确解析文件。

© www.soinside.com 2019 - 2024. All rights reserved.