Как вставить 780k записей Spring Data Postgres

CSV-файл будет загружен в корзину Amazon S3.

Текущая реализация:

  1. Чтение CSV-файла с помощью утилиты OpenCSV readAll, которая возвращает список
  2. Сопоставьте значение каждого столбца с объектом сущности
  3. Создайте объект списка (текущий размер :: 15000)
  4. Вызов Spring Data CRUD Repository saveAll (список объектов)
  5. Из 780 тыс. Записей в базе данных сохранялось только 570 тыс. Записей.
  6. После вставки такого количества записей мы не видим никаких исключений / ошибок.

Абсолютно без понятия, что там происходит после

После небольшого поиска в Google выяснилось, что команда copy в PostgreSQL - это самый быстрый способ ЧТЕНИЯ / ЗАПИСИ в БД PostgreSQL.

Это также поддерживается на нескольких языках Java, C, Python.

Пробовал использовать CopyManager API PostgreSQL, у которого есть перегруженные версии метода 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
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
1 107
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

We cannot use this since our csv contains Header Columns in the first line & we want to skip first line.

Так что просто пропустите первую строку. 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, чтобы файл можно было правильно проанализировать.

Большое спасибо за ваш ответ a_horse_with_no_name. На данный момент проблема решена, но это определенно будет для меня уроком.

Phaneendra 26.06.2018 07:29

Я предоставил решение в следующем комментарии, ошибка, которую я сделал.

Phaneendra 26.06.2018 07:30

@a_horse_with_no_name как вы обрабатываете столбец формата даты перед командой копирования? например: в csv данные могут быть в формате дд / мм / гггг, дд-мм-гггг, дд.ммм.гггг и т. д., где, например, в таблице postgres по умолчанию используется формат гггг-мм-дд.

Ajay Takur 18.07.2020 16:13
Ответ принят как подходящий

Я смог выяснить ошибку в коде. Мы предоставили один из столбцов базы данных как уникальное ограничение, чего не должно быть, тогда как в файле CSV есть повторяющиеся значения этого столбца. По этой причине вставка записи не удалась.

Спасибо, Phaneendra

@Phaneendra Как вы справляетесь с этими повторяющимися проблемами в коде?

Ajay Takur 18.07.2020 10:10

We cannot use this since our csv contains Header Columns in the first line & we want to skip first line.

Вот для чего нужен COPY ... WITH HEADER.

Specifies that the file contains a header line with the names of each column in the file. On output, the first line contains the column names from the table, and on input, the first line is ignored. This option is allowed only when using CSV format.

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