NodeJS + ExpressJS - правильный способ управления подключением к базе данных mysql - PullRequest
2 голосов
/ 09 июня 2019

Я занимаюсь разработкой приложения с использованием ReactJS / NodeJS + ExpressJS.

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

Когда я только начал своюMySQL сервер (без запуска моего приложения) соединений было уже 60, что это такое?

MariaDB [(none)]> show status like 'Conn%';
+-----------------------------------+-------+
| Variable_name                     | Value |
+-----------------------------------+-------+
| Connection_errors_accept          | 0     |
| Connection_errors_internal        | 0     |
| Connection_errors_max_connections | 0     |
| Connection_errors_peer_address    | 0     |
| Connection_errors_select          | 0     |
| Connection_errors_tcpwrap         | 0     |
| Connections                       | 60    |
+-----------------------------------+-------+
7 rows in set (0.001 sec)

Затем, как только я запустил свое приложение, количество подключений увеличилось до 64:

MariaDB [(none)]> show status like 'Conn%';
+-----------------------------------+-------+
| Variable_name                     | Value |
+-----------------------------------+-------+
| Connection_errors_accept          | 0     |
| Connection_errors_internal        | 0     |
| Connection_errors_max_connections | 0     |
| Connection_errors_peer_address    | 0     |
| Connection_errors_select          | 0     |
| Connection_errors_tcpwrap         | 0     |
| Connections                       | 64    |
+-----------------------------------+-------+
7 rows in set (0.000 sec)

Затем каждый разЯ перезапускаю свое внутреннее приложение или делаю запрос от внешнего интерфейса, кажется, что количество соединений увеличивается.

Я не уверен, как управлять соединениями, и я признаю, что некоторые части кода яиспользование не совсем понятно для меня (я новичок в реагировании, выражениях и нодах), так что наберитесь терпения.

Это часть кода, который я использую, надеюсь, вы поможете мне найти лучшийспособ управления соединениями.

Поскольку connection будет использоваться в нескольких областях моего приложения, я создал файл .js, содержащий следующее:

class Connection {

    static connect() {

        var mysql = require('mysql');
        var connection = null;

        var connection_settings = {
            host     : 'localhost',
            database : '..',
            user     : '..',
            password : '..',
        }

        connection = mysql.createConnection(connection_settings);

        connection.connect(function(err) {
            if(err) {
                console.log('error when connecting to db:', err);
            } 
        });

        return connection;

    }

}

module.exports = { Connection }

А затем файлв коде, который запрашивает db:

const { Connection } = require('../database.js')

function openLessonSections (lessonID, connection){

    return new Promise(function (resolve, reject){
        const sql = "SELECT * FROM sections WHERE lesson_id=" + lessonID;
        connection.query (sql, function (error, result){
            console.log('Loading lesson "' + lessonID + '".');
            if (error) reject (error);
            resolve (result);
        });
    });
}

async function openLesson(lessonID, connection){
    return await openLessonSections(lessonID, connection);
}

exports.lessonOpen = function(req, res, next) {

    const connection = Connection.connect();

    console.log('request received');

    const lessonID = JSON.parse(req.body.lessonID);

    console.log('Opening lesson: ' + lessonID);

    openLesson(lessonID, connection)
        .then(function(result){
            console.log('The lesson was opened successfully.');
            res.status(200).json({sections: result});
        })
        .catch(function (error){
            res.status(500).json(error);
            console.log('There was an error while opening the lesson. ' + error);
        });

    connection.end();

}

Я знаю, что делаю что-то не так, и я немного запутался в том, что такое лучший подход.Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 09 июня 2019

Один вариант - создать пул соединений (один раз):

const mysql = require('mysql');
const pool = mysql.createPool({
  host: 'myhost',
  user: 'myuser',
  password: 'mypass',
  database: 'mydb',
  connectionLimit: 10,
  supportBigNumbers: true
})

Затем, когда вы запускаете запрос, вы получаете соединение из пула:

function query(sql, args) {
  return new Promise((resolve, reject) => {
    pool.getConnection(function(err, connection) {
      if (err) {
        return reject(err);
      }
      connection.query(sql, args, function(err, result) {
        connection.release();
        if (err) {
          return reject(err);
        }
        return resolve(result);
      });
    });
  });
}

Экспорт функции query:

module.exports = {
  query
};

Поместите все это в модуль, требуйте его где угодно и используйте query, как вам угодно.

1 голос
/ 09 июня 2019

лай неправильного дерева.

STATUS Connections - это счетчик, который начинается с нуля при запуске сервера (mysqld).Connections/Uptime более интересно - это может быть около 1 в секунду или 1 в час.Я видел, что Connections превышает миллиард, но сервер работал несколько недель.

С другой стороны, может быть некоторая форма «пула соединений», но это может быть введено любым изнесколько компонентов в вашем стеке.

Я пытаюсь понять, каков наилучший способ обработки соединений с базой данных.

Простой ответ - не волнуйтесьоб этом ".

Одна веб-страница должна (в большинстве случаях) включать одно соединение MySQL / MariaDB.Если ваш код создает несколько соединений для создания одной веб-страницы, то это неэффективно.У вас, кажется, есть кое-что через различные компоненты JS?Вероятно, это не «сохраненное состояние», поэтому им, возможно, придется создавать отдельные соединения.Нарисуйте схему (или составьте список) «потока данных».Если оно «слишком много», то это «не хорошо».Нормальные веб-страницы имеют одно соединение, постройте всю страницу и уходите.Однако с JS и AJAX заманчиво делать взад и вперед - сопротивляйтесь , за исключением , когда необходимо взаимодействие.

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