Node.js + socket.io и mysql как организовать соединение?

Нужно сделать чат, для этого решил использовать связку node.js + socket.io и mysql.

В качестве БД выбор пал на mysql т.к она используется для сайта на котором будет висеть чат. С таблицами которые будет задействованы для работы чата будет работать как node.js так и php скриты сайта.

Отсюда вытекает вопрос.
Как в node.js организовать соединение с БД т.е подключиться всего один раз и через это соединение работать с БД или на каждый запрос от клиента делать соединение, выполнять нудные действия с БД и разрывать соединение.
  • Вопрос задан
  • 10605 просмотров
Пригласить эксперта
Ответы на вопрос 4
MarcusAurelius
@MarcusAurelius Куратор тега Node.js
автор Impress Application Server для Node.js
Нужно открывать пул соединений через mysql.createPool используя библиотеку https://www.npmjs.org/package/mysql чтобы не случилось, что какое-то занято на долго запросом, а другое в ассинхронном режиме пришло и хочет быть обработано, пока предыдущее еще не вернулось. На событие разрыва соединения нужно навешивать его возобновление. Для случая с одним соединением так (для пула это нужно навесить на каждый конекшен:
var mysql = require('mysql');
connectMySql();

function connectMySql() {
    var connection = mysql.createConnection(connectionString);

    connection.connect(function(err) {
        if (err) {
            setTimeout(function() {
                connectMySql()
            }, 3000);
        }
    });

    connection.on('error', function(err) {
        if (err.code === 'PROTOCOL_CONNECTION_LOST') connectMySql();
    });
}

Если у вас небольшое приложение, то не стесняйтесь сделать конекшен или пул глобальным, чтобы он был сразу определен на обработчиках, а еще лучше сделайте для своего приложения неймспейс в глобальном контексте, например myApp = {} и в него запишите myApp.db = connection чтобы потом писать myApp.db.query(...); Посмотрите, какие красивые и лаконичные обработчики можно сделать, если не вестись на эти REST-суеверия и предубеждения против состояния на сервере и открытых долго конекшенов к БД и глобальных неймспейсов:
// Обработчик для API по урлу http://127.0.0.1/example/app/examples/mysql/getCities.json
module.exports = function(client, callback) {
  aliasNameMy.query('select * from City', function(err, rows, fields) {
    callback({ rows:rows, fields:fields });
  });
}

На гитхабе этот обработчик в контексте демо-приложения: https://github.com/tshemsedinov/impress/blob/maste...

Ну и еще порекомендую свои утилиты для драйвера MySQL - https://www.npmjs.org/package/mysql-utilities
и две статьи на Хабре, одну по этим утилитам - habrahabr.ru/post/198738 , а вторую по архитектуре в целом - habrahabr.ru/post/204958
Ответ написан
Sanasol
@Sanasol
нельзя просто так взять и загуглить ошибку
https://github.com/S-anasol/sancrypto/blob/master/...
Вот пример

Ставишь node-mysql или просто mysql не помню точно и вперед.

npm install node-mysql
Ответ написан
Комментировать
Boniface
@Boniface
Долго соединение открытым держать не стоит. Правило: открывайте как можно позже, закрывайте как можно раньше.
Ответ написан
Комментировать
CartmanGui
@CartmanGui Автор вопроса
Тимур Шемсединов, у меня тут вопрос по поводу пула соединений с БД.
Вот к примеру в основном файле приложения я создаю глобальный пул
app.js
global.appChat = {};
appChat.pool = mysql.createPool(config.get('mysql'));

Потом в модуле user создаю методы для работы с БД

user.js
module.exports.getUserById = function(userId, callback){
    $sql = 'SELECT * users WHERE id = ?';
    appChat.pool.getConnection(function(err, connection) {
        if (err) throw err;
        connection.query($sql, [userId], function(err, rows, fields) {
            if (err) throw err;
            connection.release();
            callback(null, rows.length ? rows[0] : null);
        });
    });
};

module.exports.getUsers = function(callback){
    $sql = 'SELECT * FROM users';
    appChat.pool.getConnection(function(err, connection) {
        if (err) throw err;
        connection.query($sql,function(err, rows, fields) {
            if (err) throw err;
            connection.release();
            callback(null, rows);
        });
    });
};


Теперь когда я буду вызывать где либо методы модуля user то каждый раз будет создаваться новое соединение с БД и как я понял вызов connection.release(); не закрывает соединение (т.к в доках для node-mysql написано что все соединения пула закрываются вызовом pool.end) то они будет постоянно открыты и накапливаться?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы