Запросы к базе данных каждую секунду, вероятно, слишком часто. Возможно, один запрос не завершится 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
})
}
}
Опять же, опрос СУБД один раз в секунду - это выбор проекта, который вам следует пересмотреть. СУБД являются самым дефицитным ресурсом и узким местом во многих веб-приложениях, и их опрос может создать для них большую нагрузку, чем вы хотите.