При использовании poolConnection или CreateConnection felixge/node -mysql

Я использую https://github.com/felixge/node-mysql для моего приложения Когда и зачем использовать

db_pool = mysql.createConnection(db);

или

db_pool = mysql.createPool(db);

Каковы различия? и когда их использовать?

Ответ 1

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

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

Ответ 2

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

Многие пользователи PHP и .NET привыкли к пулу соединений, поскольку стандартные уровни доступа к данным в этих платформах автоматически соединяются с пулами (в зависимости от того, как вы обращаетесь к базе данных.)

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

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

Например, здесь переменная env_settings на сервере приложений содержит глобальные настройки, включая активный пул соединений:

var http = require("http");
var mysql = require('mysql');

var env_settings = {
    dbConnSettings: {
        host: "localhost",
        database: "yourDBname",
        user: "yourDBuser",
        password: "yourDBuserPassword"
    },
    port: 80
};

// Create connection pool
env_settings.connection_pool = mysql.createPool(env_settings.dbConnSettings);

var app = connect()
    .use(site.ajaxHandlers(env_settings));

http.createServer(app).listen(env_settings.port);

И вот модуль ajaxHandlers, который использует пул соединений:

ajaxHandlers = function (env_settings) {

    return function ajaxHandlers(req, res, next) {

        var sql, connection;

        env_settings.connection_pool.getConnection(function(err, connection) {

            sql = "SELECT some_data FROM some_table";

            connection.query(sql, function(err, rows, fields) {

                if (err) {
                    connection.release();
                    // Handle data access error here
                    return;
                }

                if (rows) {
                    for (var i = 0; i < rows.length; i++) {
                        // Process rows[i].some_data
                    }
                }

                connection.release();
                res.end('Process Complete');
                return;
            });
        });
    }
}

/* Expose public functions ------ */
exports.ajaxHandlers = ajaxHandlers;

Метод connection_pool.getConnection является асинхронным, поэтому, когда существующее открытое соединение возвращается из пула или при необходимости открывается новое соединение, вызывается функция обратного вызова, и вы можете использовать соединение. Также обратите внимание на использование connection.release() вместо завершения соединения как обычно. Релиз просто позволяет пулу вернуть соединение, чтобы его можно было повторно использовать.

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

При объединении пула приложение будет открывать только новые соединения, если ни один из них не находится в пуле. Таким образом, пул откроет кучу новых соединений по первым нескольким запросам и оставит их открытыми. Теперь, когда будет сделан новый запрос, процесс объединения пулов получит соединение, которое уже открыто и использовалось раньше, вместо открытия нового соединения. Это будет быстрее, и будет меньше активных подключений к базе данных при большой нагрузке. Конечно, будет открыто больше "ожидающих" соединений, когда никто не ударит по серверу, так как они удерживаются в пуле. Но это обычно не проблема, потому что сервер имеет множество ресурсов, доступных в этом случае.

Таким образом, объединение пулов базы данных может быть использовано для ускорения работы вашего приложения и более масштабируемого. Если у вас очень мало трафика, это не так важно - если вы не хотите как можно быстрее возвращать результаты. Объединение пулов, если это часто является частью общей стратегии для уменьшения латентности и повышения общей производительности.