Ошибка при попытке запустить семена: Knex: Время ожидания получения соединения. Бассейн, вероятно, полон

#javascript #node.js #knex.js

Вопрос:

Я получаю эту ошибку каждый раз, когда запускаю yarn knex seed:run :

Ошибка при выполнении «/home/user/path-to-the-file/my-seed.js» начальное значение: Knex: Время ожидания получения соединения. Бассейн, наверное, полон. Вы пропускаете вызов. transacting(trx)?

Проблема в том, что я отправляю проект другим людям, и они могут запустить его нормально, я уже перепробовал все ответы об этом в Интернете, я больше не знаю, что делать.

Конфигурация моей базы данных:

 const config = Object.freeze({
  client: 'pg',
  pool: {
    min: 0,
    max: 5,
    idleTimeoutMillis: 30000,
    createTimeoutMillis: 3000,
    acquireTimeoutMillis: 30000,
    reapIntervalMillis: 1000,
    createRetryIntervalMillis: 100,
    propagateCreateError: false
  },
  connection: Object.freeze({
    ...database
  })
})
 
  • Версия Knex: «^0.95.8»
  • версия pg: «^8.7.1»
  • Версия пряжи: 1.22.11
  • Версия узла: 14.17.4

Я уже пытался понизить рейтинг pg и узла, это не сработало, ничего не работает.

В репозитории Knex есть проблема, в которой говорится, что обновление до последней pg версии решает ее, но это тоже не сработало: https://github.com/knex/knex/issues/2820

Кто-нибудь может мне помочь?

Комментарии:

1. В твоих семенах есть жучки. Никто не сможет вам помочь, если вы не покажете код взлома. Попробуйте удалить, уменьшив размер примера кода до части, которая на самом деле вызывает сбой.

2. Что это может быть за ошибка? Почему это просто не показывает мне реальную ошибку, вместо того, чтобы выдавать эту общую ошибку.

3. Это своего рода ошибка, когда вы запрашиваете у knex слишком много параллельных подключений, и у него заканчивается количество подключений, которые он может вам предоставить. Knex также не знает лучше, что вы делаете с этими соединениями. Вы можете отслеживать, какие запросы/транзакции выполняет knex, например, установив DEBUG=knex:* переменную среды перед запуском семян.

Ответ №1:

Один из простых способов создания этой ошибки заключается в следующем:

 const rows = [];
for (let i =  0; i < 10000; i  ) {
  rows.push({ name : `foo  ${i}` });
}
await Promise.all(rows.map(data => knex('user').insert(data)));
 

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

Лучший способ выяснить причину, по которой это происходит, — удалить части проблемного кода до тех пор, пока ошибка больше не исчезнет, а затем выяснить, почему этот сокращенный тестовый пример завершается неудачно.

Один из хороших способов узнать, что делает knex внутри, — это задать DEBUG=knex:* переменную среды перед запуском кода, чтобы knex выводил информацию о запросах, транзакциях и соединениях с пулом во время выполнения кода.

Комментарии:

1. Да, вот что произошло, я просто уменьшил значение переменной, которая вставила слишком много строк, и мои семена начали работать нормально, я все еще не понимаю, это из-за производительности моего компьютера или плохо написанного кода? Потому что у моих коллег программа работает нормально, но для меня это всегда приводит к ошибке.

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

Ответ №2:

столкнулся с аналогичной проблемой, перешел на 8.7.1, и это сработало

также узел до 16.3.1 и knex до 0.95.11

Комментарии:

1. Я перепробовал все: понижение, обновление pg, node, что угодно, единственный способ решить-это обновить свой компьютер с HD до SSD. Это проблема с кодом, у компании, в которой он работал, была эта проблема, и мне пришлось ее запустить, но я был плохо написан, не учитывая производительность, так что, вероятно, аппаратное обеспечение не справилось с этим.

2. вы используете возражение или typeorm или любой другой orm.?