После многих последовательных и успешных запросов SQL Server начинает отказывать в соединениях

#node.js #sql-server #docker #graphql #typeorm

#node.js #sql-server #docker #graphql #typeorm

Вопрос:

У меня есть сервер GraphQL, который использует typeorm для подключения к серверу SQL, также он работает внутри контейнера docker, параметры подключения:

   let connection = await createConnection({
    type: "mssql",
    host: HOST,
    port: PORT,
    database: DB,
    username: USER,
    password: PASSWORD,
    // NOTE: Use typeorm-model-generator for Entities
    logging: false,
    synchronize: true,
    requestTimeout: 300000,
    connectionTimeout: 300000,
    entities: ["./models/mssql"],
    pool: {
      max: 1000, min: 1,
      idleTimeoutMillis: 3000,
      evictionRunIntervalMillis: 1500000,
    },
    options: {
      encrypt: false,
    }
  })
 

Проблема:
После многочисленных успешных запросов SQL Server начинает отказывать в соединениях с ошибкой:

«Ошибка подключения: не удалось подключиться к x.x.x.x: port — connect ECONNREFUSED x.x.x.x:port»

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

Я тестировал те же данные, в которых соединения отклоняются внутри контейнера и не отклоняются в отладчике VS Code или при запуске с терминала. Я попытался поработать с параметрами пула, которые дали скромные результаты. Я также проверил, что я не превышаю количество подключений, разрешенных БД. Я проверил журналы на SQL Server, в них нет проблем или ошибок во время выполнения запросов.

Редактировать:

Я

Я только что добавил поддержку отслеживания попыток входа в журнал на сервере SQL, и теперь он регистрирует около 776 успешных входов в систему из этого приложения за период 15:03:46.01 — 15:04:48.07 и после этого я предполагаю, что я получаю ошибки

II

Я попытался изменить параметр «Размер сетевого пакета» в параметрах Sql Server и параметрах подключения PacketSize в typeorm -> mssql -> tedious, который не сработал, но выявил некоторые новые детали. Поскольку мне пришлось перезагрузить сервер, применить новые параметры Sql, сразу после сброса запросы успешно завершились.

Итак, я попытался отслеживать ресурсы и увидел, что сервер довольно быстро увеличивает производительность процессора до 100%, и после этого возникают проблемы с открытием новых подключений, и если я разрешаю слишком большое максимальное значение в параметрах пула (в моем случае 500) подключений, он начинает отказывать в подключениях.

Однако, когда я отключаю свойство max, возникает ошибка нового типа, которая проявляется в том, что время ожидания соединения истекло по неизвестной причине, на этот раз из-за tarn.js .

III

Я думаю, что происходит то, что tarm.js (базовый пул подключений) имеет тайм-аут по умолчанию для createTimeoutMillis / добавления новых подключений в пул, и эта опция не отображается через API typeorm, и пока он ожидает на сервере разморозки и разрешения выделения нового подключения, время ожидания истекает.

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

1. ECONNREFUSED — это ошибка TCP-соединения, поэтому экземпляр базы данных не увидит попытку.

2. Убедитесь, что у вас не заканчивается память.

3. Хммм, вы имеете в виду внутри приложения узла или на стороне сервера?