Как проверить, открыто ли соединение БД? (mysql2 node.js) - PullRequest
0 голосов
/ 28 апреля 2020

Уважаемые stackoverflowers:)
Я делаю свое первое mvc приложение на node.js и у меня возникает такая проблема:
Иногда, когда я не выполняю никаких запросов к базе данных в течение длительного времени ( около 3 минут) и попробуйте сделать одно, у меня появляется такая ошибка: «Этот сокет был завершен другой стороной»
Я обнаружил, что это из-за опции wait_timeout в конфигурации mysql, которая закрывает соединение если время простоя больше, чем значение
Так я прав, что перед каждым запросом к базе данных я должен проверять соединение на наличие открытых? И если я должен, как и где?
Это мой файл подключения БД:

const mysql = require('mysql2');

// create the connection to database
const connection = mysql.createConnection({
    host: 'localhost',
    user: 'mysql',
    password: 'mysql',
    database: 'qa'
});

exports.connect = (done) => {
    connection.connect((err) =>{
        if(err){
            console.log('db connection error');
        }
        else{
            done()
        }
   })
}

exports.connection = connection;

И это часть одной из моих моделей:

const db = require('../db');
exports.makeNewQuestion = async (topic, text, subsection, user) => {
    return db.connection.promise().execute("INSERT INTO `questions` (`topic`, `text`, 
    `subsection_id`, `user_id`) VALUES (?, ?, ?, ?)", [topic, text, subsection, user]);
}

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Насколько я знаю, вам не нужен запрос к существующей таблице для проверки соединения / Вы можете использовать что-то вроде:

select 1

Если это работает, вы подключены.

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

0 голосов
/ 28 апреля 2020

Лучшим способом было бы просто перехватить и обработать ошибку запроса (или сборки соединения).

connection.query(
  'SELECT * FROM `table` WHERE `name` = ? AND `age` > ?',
  ['Page', 45],
  function(err, results) {
    if (err) {
      // handle error here
      return; // prevent continue of function;
    }
    // use the results
    console.log(results);
  }
);

Это также предполагаемый способ создателей node-mysql2, потому что это Построить на стандартном узле - mysql ( см. проект do c), который определяет их предполагаемую обработку ошибок для пользователей здесь .

Проверка на открытость Соединение до фактического запроса создает большие накладные расходы для процесса запроса и замедляет все. Кроме того: сделать это на самом деле не так надежно, потому что теоретически соединение может прерваться или прерваться в противном случае, когда проверка будет завершена и ее подтверждение возвращается.

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