Отсутствие отдельного подключения (сеанс/процесс бд) для каждого юзера системы node.js mysql2 express

Объясните пожалуйста как это работает? Есть подключение к базе данных (database.js)

const { createPool } = require('mysql2') 
const { database } = require('./app.config.json')
let db = createPool(database)
module.exports = db

app.config.json:

{
  "database": {
    "host": "192.168.0.200",
    "user": "user_oem_test",
    "password": "12345678",
    "database": "oem_db_test",
    "connectionLimit": 10,
    "dateStrings": true,
    "multipleStatements": true,
    "waitForConnections": true,
    "queueLimit": 0
  },
  "port": 5000
}

запросы происходят через model, соntroller, router

models/monitor.js:

const { json } = require('body-parser')
const { promise } = require('../database')
const db = require('../database')
const { options } = require('../routes/monitor')
const monitor = require('../routes/monitor')
const Monitor = function () {}

////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
db.getConnection(async function (err, conn) {
  if (err) {
    db.destroy()
    return cb(err)
  }
  try {
    Monitor.getRepairAccessories = (id, callback) => {
      conn.query(
        'CALL `fGetMonitorAccessoriesforRepair`(?)',
        id,
        (err, res) => {
          if (err) {
            callback(err, null)
            return
          }
          if (res[0].length) {
            callback(null, res)
            return
          }
          callback({ message: 'not_found' }, null)
        }
      )
    }

    Monitor.addFromRepairAccess = (newRepairs, callback) => {
      conn.query(
        'CALL `fRepairAccessoryAdd`(?, ?, ?)',
        [newRepairs.accessories, newRepairs.num, newRepairs.comment],
        (err, res) => {
          if (err) {
            callback(err, null)
            return
          }
          if (res[0].length) {
            callback(null, res)
            return
          }
          callback(null, ...newRepairs)
        }
      )
    }

    Monitor.updateFromRepairAccess = (id, newRepairs, callback) => {
      conn.query(
        'CALL `fRepairAccessoryUpdate`(?, ?, ?)',
        [id, newRepairs.num, newRepairs.comment],
        (err, res) => {
          if (err) {
            callback(err, null)
            return
          }
          callback(null, { id, ...newRepairs })
        }
      )
    }

    Monitor.deleteFromRepairAccess = (id, callback) => {
      conn.query('CALL `fRepairAccessoryDelete`(?)', id, (err, res) => {
        if (err) {
          callback(err, null)
          return
        }
        if (res.length) {
          callback(null, res)
          return
        }
        callback({ message: 'not_found' }, null)
      })
    }

    Monitor.getDataAccessories = callback => {
      conn.query('CALL `fRepairAccessoryGet`', (err, res) => {
        if (err) {
          callback(err, null)
          return
        }
        if (res[0].length != null) {
          callback(null, res[0])
          return
        }
        callback({ message: 'not_found' }, null)
      })
    }

    Monitor.createRepairs = (newRepairs, callback) => {
      conn.query(
        'CALL `fAddRepair`(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
        [
          newRepairs.id_monitors,
          newRepairs.order_num,
          newRepairs.warranty,
          newRepairs.date_receipt,
          newRepairs.malfunction,
          newRepairs.date_repair,
          newRepairs.date_verif,
          newRepairs.date_ship,
          newRepairs.id_user,
          newRepairs.id_contact,
          newRepairs.id_client,
          newRepairs.id_status,
          newRepairs.comment_str,
        ],
        (err, res) => {
          if (err) {
            callback(err, null)
            return
          }
          callback(null, { id: res[0][0].id, ...newRepairs })
        }
      )
    }
    ////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////
    Monitor.copy = async (id, callback) => {
      if (typeof callback === 'function') {
        conn.query('CALL `fMonitorTmpCopy`(?)', id, (err, res) => {
          if (err) {
            callback(err, null)
            return
          }
          if (res[0].length != null) {
            callback(null, res)
            return
          }
        })
      } else {
        const res = await conn
          .promise()
          .query('CALL `fMonitorTmpCopy`(?)', [id])
        return res
      }
    }
    Monitor.updateCopyMon = (id, newMonitor, callback) => {
      conn.query(
        'CALL `fMonitorTmpUpdate`(?, ?, ?, ?, ?, ?)',
        [
          id,
          newMonitor.release,
          newMonitor.verif,
          newMonitor.comment,
          newMonitor.dealer,
          newMonitor.client,
        ],
        (err_str, res) => {
          let mess = res[0][0]['result']
          err_str = 'monitor already exist'

          if (mess == err_str) {
            callback(err_str)
            return
          }
          if (res[0].length != null) {
            callback(null, res)
            return
          }
          callback(null, ...newMonitor)
        }
      )
    }

    Monitor.saveCopyMon = async (id, callback) => {
      if (typeof callback === 'function') {
        conn.query('CALL `fMonitorTmpSave`(?)', id, (err, res) => {
          if (err) {
            callback(err, null)
            return
          }
          if (res[0].length != null) {
            callback(null, res)
            return
          }
          callback(null, id)
        })
      } else {
        const res = await conn
          .promise()
          .query('CALL `fMonitorTmpSave`(?)', [id])
        return res
      }
    }

    Monitor.getMonitorDataAccessories = callback => {
      conn.query('CALL `fMonitorTmpAccessoryGet`()', (err, res) => {
        if (err) {
          callback(err, null)
          return
        }
        if (res[0].length != null) {
          callback(null, res[0])
          return
        }

        callback({ message: 'not_found' }, null)
      })
    }

... еще сколько-то запросов
  } catch (err) {
    const errorPart1 = error.message.split(';')[0]
    const errorPart2 = error.message.split(' use ')[1]
    console.log(`%cError: ${errorPart1} ${errorPart2}`, 'color: #e53935')
  } finally {
    console.log('its db')
    function printDb() {
      console.log('connections')
      console.log(db._allConnections)
      console.log(db._allConnections.length)
    }
    setTimeout(function () {
      printDb()
    }, 10000)
    conn.release()
  }
})

Monitor.searchingMon = (id, callback) => {
  db.query(
    `SELECT * FROM monitors WHERE serial_number LIKE ? ORDER BY serial_number LIMIT 100`,
    `${id}%`,
    (err, res) => {
      if (err) {
        callback(err, null)
        return
      }
      callback(null, res)
    }
  )
}
async function addDefaultAccessories(monitor) {
  const res = await db
    .promise()
    .query('CALL fGetDefaultAccessories(?, ?)', [
      monitor.id_monitors_ispolnenie,
      monitor.id_complect,
    ])
  for (let item of res[0][0]) {
    db.query('INSERT INTO monitor_accessories SET ?', {
      id_mon: monitor.id,
      id_accessories: item.id,
      num: 1,
      comment: '',
    })
  }
}

Monitor.create = (newMonitor, callback) => {
  db.query('INSERT INTO monitors SET ?', newMonitor, (err, res) => {
    if (err) {
      callback(err, null)
      return
    }
    addDefaultAccessories({ id: res.insertId, ...newMonitor })
    callback(null, { id: res.insertId, ...newMonitor })
  })
}
...еще много запросов
module.exports = Monitor

P.S. Тут используется работа с временными таблицами, от того и проблема. Заранее спасибо за советы, касательно отказа от данного механизма, но это не совсем то, что нужно.

Таких файлов с запросами несколько.

Основной вопрос: Скажите пожалуйста, как это работает. Почему для каждого пользователя системы(многопользовательский портал, авторизация происходит по id и хранится в бд) не создается отдельное независимое подключение(процесс/сеанс в бд), оно пользуется одним процессом, от чего происходят сильные сбой, пользователи видят временные таблицы, которые создал другой юзер, потому что они делят сеанс. Что делать?


Ответы (0 шт):