Skip to main content
 首页 » 编程设计

java之如何插入 780k 记录 Spring Data Postgres

2024年06月03日13exmyth

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

当前实现:

  1. 使用返回列表的 OpenCSV 实用程序的 readAll 读取 CSV 文件
  2. 将每个列值映射到一个实体对象
  3. 创建一个列表对象(当前大小::15000)
  4. 调用 Spring Data CRUD Repository saveAll(List objects)
  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

请您参考如下方法:

我能够找出代码缺陷。 我们已经提供了其中一个数据库列作为唯一约束,而在 CSV 文件中,此列有重复值。由于这个原因,记录插入失败。

谢谢, 仙女座