Я использую https://github.com/felixge/node-mysql для моего приложения Когда и зачем использовать
db_pool = mysql.createConnection(db);
или
db_pool = mysql.createPool(db);
Каковы различия? и когда их использовать?
Я использую https://github.com/felixge/node-mysql для моего приложения Когда и зачем использовать
db_pool = mysql.createConnection(db);
или
db_pool = mysql.createPool(db);
Каковы различия? и когда их использовать?
Одно соединение блокируется. Выполняя один запрос, он не может выполнять другие. Следовательно, пропускная способность вашей базы данных может быть уменьшена.
Пул управляет многими лениво созданными (в модуле) модулями. В то время как одно соединение занято запуском запроса, другие могут использоваться для выполнения последующих запросов. Это может привести к увеличению производительности приложений, поскольку он позволяет параллельно запускать несколько запросов.
Пул соединений позволяет повторно использовать существующие подключения к базе данных, а не открывать новое соединение для каждого запроса в вашем приложении 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()
вместо завершения соединения как обычно. Релиз просто позволяет пулу вернуть соединение, чтобы его можно было повторно использовать.
Вот хороший способ подумать о различии. Возьмем пример очень простого приложения, которое принимает запросы и возвращает набор данных, содержащий результаты. Без объединения пулов каждый раз, когда выполняется запрос, в базу данных открывается новое соединение, результаты возвращаются, а затем соединение закрывается. Если приложение получает больше запросов в секунду, которое может выполнить, количество параллельных открытых транзакций увеличивается, так как в любое время активировано несколько подключений. Кроме того, каждая транзакция займет больше времени, поскольку она должна открыть новое соединение с сервером данных, что является относительно большим шагом.
При объединении пула приложение будет открывать только новые соединения, если ни один из них не находится в пуле. Таким образом, пул откроет кучу новых соединений по первым нескольким запросам и оставит их открытыми. Теперь, когда будет сделан новый запрос, процесс объединения пулов получит соединение, которое уже открыто и использовалось раньше, вместо открытия нового соединения. Это будет быстрее, и будет меньше активных подключений к базе данных при большой нагрузке. Конечно, будет открыто больше "ожидающих" соединений, когда никто не ударит по серверу, так как они удерживаются в пуле. Но это обычно не проблема, потому что сервер имеет множество ресурсов, доступных в этом случае.
Таким образом, объединение пулов базы данных может быть использовано для ускорения работы вашего приложения и более масштабируемого. Если у вас очень мало трафика, это не так важно - если вы не хотите как можно быстрее возвращать результаты. Объединение пулов, если это часто является частью общей стратегии для уменьшения латентности и повышения общей производительности.