Ответ 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()
вместо завершения соединения как обычно. Релиз просто позволяет пулу вернуть соединение, чтобы его можно было повторно использовать.
Вот хороший способ подумать о различии. Возьмем пример очень простого приложения, которое принимает запросы и возвращает набор данных, содержащий результаты. Без объединения пулов каждый раз, когда выполняется запрос, в базу данных открывается новое соединение, результаты возвращаются, а затем соединение закрывается. Если приложение получает больше запросов в секунду, которое может выполнить, количество параллельных открытых транзакций увеличивается, так как в любое время активировано несколько подключений. Кроме того, каждая транзакция займет больше времени, поскольку она должна открыть новое соединение с сервером данных, что является относительно большим шагом.
При объединении пула приложение будет открывать только новые соединения, если ни один из них не находится в пуле. Таким образом, пул откроет кучу новых соединений по первым нескольким запросам и оставит их открытыми. Теперь, когда будет сделан новый запрос, процесс объединения пулов получит соединение, которое уже открыто и использовалось раньше, вместо открытия нового соединения. Это будет быстрее, и будет меньше активных подключений к базе данных при большой нагрузке. Конечно, будет открыто больше "ожидающих" соединений, когда никто не ударит по серверу, так как они удерживаются в пуле. Но это обычно не проблема, потому что сервер имеет множество ресурсов, доступных в этом случае.
Таким образом, объединение пулов базы данных может быть использовано для ускорения работы вашего приложения и более масштабируемого. Если у вас очень мало трафика, это не так важно - если вы не хотите как можно быстрее возвращать результаты. Объединение пулов, если это часто является частью общей стратегии для уменьшения латентности и повышения общей производительности.