@VelkinVV

Prisma, как обновить множество данных без лимита по количеству соединений?

Приветствую.
Помогите разобраться с проблемой.
Мне необходимо обновить сохранить в базу большое количество данных с уникальным ключом. Соответственно, при совпадении ключа, пропустить или обновить данные (без разницы).
Бекенд на Nest.js и Prisma orm.
Т.к. данных слишком много (более 500 тыс. строк), я разбиваю их на массивы по 500 строк.
CreateMany в данном случае не подходит, т.к. если база будет содержать ключ из массива, то не сохранится весь массив.

В typeorm я бы просто использовал просто upsert, а вот prisma в upsert не умеет вставлять массивы.
Я пробую перебрать массив и вставить данные, но получаю ошибку по количеству соединений.
Timed out fetching a new connection from the connection pool. More info: pris.ly/d/connection-pool (Current connection pool timeout: 10, connection limit: 9)


При условии, что это один пользователь, а нужно, чтобы такие данные могли грузить множество пользователей.
Как правильно обновлять большое количество данных через Prisma ?
Мой код:
newArr?.map(async (arr) => {
				arr?.map(async (el) => {
					await this.prisma.payments.upsert({
						where: { transaction_id: el.transaction_id },
						create: el,
						update: el,
					});
				});        
      }),
  • Вопрос задан
  • 127 просмотров
Решения вопроса 1
YuriyVorobyov1333
@YuriyVorobyov1333
Software Developer
Если идти таким путем, то лучше уже использовать for await of для последовательного помещения в БД

P.S. также ваш код с map не валиден, он не будет ждать, для map надо использовать Promise.all, что и является источником проблемы в данном случае
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Ну ты можешь в качестве ключа использовать UUID. Так делают в распределенных системах когда много генераторов данных и все друг о друге не знают и не синхронизируются.

Или можешь сам с собой договориться что каждому продюсеру данных дается диапазон. Для первого будет от 0 до 500 000 и для второго 500 001 до 1 000 000 и так далее.

Есть генераторы основанные на текущем времени и мак-адресе хоста. Да много чего можно придумать.

Игры в upsert или retry логикой могут заблокировать джобы надолго. Они могут кружиться в вальсе вместе
постоянно наступая на конфликты. И это трудно пофиксить.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы