Запретить закрытие пула соединений с базой данных knex во время простоя - PullRequest
0 голосов
/ 25 апреля 2019

Я использую Knex.js для обработки моих соединений с базой данных.Я пытаюсь предотвратить пул соединений от разрушения соединений, которые были незаняты.

Моя конфигурация выглядит следующим образом

    {
      "client": "pg",
      "connection": {
        "host" : "localhost",
        "port" : "15432",
        "user" : "postgres",
        "password" : "",
        "database" : "postgres",
        "charset" : "utf8"
      },
      "pool": {
        "min" : 1,
        "max": 7,
        "idleTimeoutMillis": Number.MAX_SAFE_INTEGER
      },
      "migrations": {
        "directory": "app/database/migrations"
      }
    }

Однако я все еще продолжаю получать

{"errno":"ETIMEDOUT","code":"ETIMEDOUT","syscall":"read"}

После периода бездействия.

Насколько мне известно, по прошествии достаточного количества времени соединение следует выбрасывать из пула.Так что, если соединения не используются какое-то время (это мой случай), в пуле не будет соединений, и первый вызов, который я попытаюсь, потерпит неудачу с данной ошибкой.Последующие звонки проходят гладко (до нового тайм-аута)

Мой вопрос - как это предотвратить?

EDIT

после того, как мое приложение какое-то время простаивает, первая операция, которая должна перейти на уровень базы данных, завершается неудачно с данной ошибкой.Любой повторный звонок будет успешным.Вот почему я пришел к выводу, что knex не обнаруживает, что соединение отбрасывается как бездействующее, и не восстанавливает соединение вовремя для завершения первого запроса.Я также считаю, что проблема на стороне knex, а не на стороне базы данных.

1 Ответ

0 голосов
/ 26 апреля 2019

Так что мне удалось исправить

{"errno":"ETIMEDOUT","code":"ETIMEDOUT","syscall":"read"}

ошибок, сделав конфигурацию, подобную этой

{
  "client": "pg",
  "connection": {
    .
    .
    .      
  },
  "pool": { <- this is important
    "min" : 0 
  },
}

Я нашел предлагаемое решение на https://gist.github.com/acgourley/9a11ffedd44c414fb4b8

ThingЯ не смог понять, почему это решение и почему моя предыдущая конфигурация не работала.

Важно отметить, что эти решения будут не работать

{
  "client": "pg",
  "connection": {
    .
    .
    .      
  },
  "pool": { 
    "min" : 0,
    "max" : 7 <- this fails in the same manner
  },
}

или

{
  "client": "pg",
  "connection": {
    .
    .
    .      
  },
  "pool": { 
    "min" : 0,
    "max" : 7 <- this fails in the same manner
    "ping": () => {... ping function ...}
  },
}

Так что для меня это выглядит как обход некоторыхсуществующая ошибка ... Ошибка находится в knex или tarn.js или в node-postgres.Или проблема может заключаться в том, что я принципиально не понимаю, как работают драйверы баз данных JS.

...