Контролировать время и отправлять запросы каждую секунду с Node Js? - PullRequest
0 голосов
/ 18 января 2020

Я пишу веб-программное обеспечение с node js. Я также использую базу данных Ms sql. У меня есть таблица, которая имеет значение datetime и битовое значение. Значение бита всегда равно 0, пока реальное время не станет равным значению datetime. Если они равны, значение бита будет равно 1.

Окей, вопрос в том, «Как я могу проверять значение в реальном времени и значение datetime в таблице каждый раз?»

Я использовал setInterval fun c и сервер сам закрылся через 3 или 4 раза. Странно то, что я не вижу ни кода ошибки, ни чего-либо подобного после закрытия сервера.

Мне нужна помощь. Если у вас есть идеи о том, как решить, пожалуйста, помогите мне. Я что-то слышал о socket.io, но сейчас не знаю, как его адаптировать.

1 Ответ

0 голосов
/ 18 января 2020

Запросы к базе данных каждую секунду, вероятно, слишком часто. Возможно, один запрос не завершится sh до начала следующего.

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

Примерно так: не отлажен.

const sql = require('mssql')

const pool = new sql.ConnectionPool(config)
const poolConnect = pool.connect()

pool.on('error', err => {
    // ... error handler
})

function intervalTimer() {
    return poolConnect.then((pool) => {
            pool
              .request()
              .execute('SELECT whatever', (err, result) => {
                // ... error checks
                console.dir(result)
            })
         }).catch(err => {
            // ... error handler
         })
}

Или, вы можете даже пропустить запрос, если предыдущий не был выполнен. Этот код делает это с логическим значением intervalTimerInProgress. Он устанавливает его непосредственно перед началом запроса и очищает его по завершении запроса.

const sql = require('mssql')

const pool = new sql.ConnectionPool(config)
const poolConnect = pool.connect()

pool.on('error', err => {
    // ... error handler
})

let intervalTimerInProgress = false
function intervalTimer() {
  if (!intervalTimerInProgress) {
    intervalTimerInProgress = true
    return poolConnect.then((pool) => {
            pool
              .request()
              .execute('SELECT whatever', (err, result) => {
                // ... error checks
                console.dir(result)
                intervalTimerInProgress = false
            })
         }).catch(err => {
            // ... error handler
         })
  }
}

Опять же, опрос СУБД один раз в секунду - это выбор проекта, который вам следует пересмотреть. СУБД являются самым дефицитным ресурсом и узким местом во многих веб-приложениях, и их опрос может создать для них большую нагрузку, чем вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...