【发布时间】:2014-01-10 13:35:18
【问题描述】:
我在我的应用程序中使用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);
有什么区别?以及何时使用它们?
【问题讨论】:
单个连接阻塞。在执行一个查询时,它不能执行其他查询。因此,您的数据库吞吐量可能会降低。
一个池管理许多延迟创建的(在 felixge 的模块中)连接。当一个连接忙于运行查询时,其他连接可用于执行后续查询。这可以提高应用程序的性能,因为它允许并行运行多个查询。
【讨论】:
连接池允许您重用现有的数据库连接,而不是为 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() 而不是正常结束连接。释放只是允许池收回连接,以便可以重复使用。
这是思考差异的好方法。以一个非常简单的应用程序为例,它接受请求并返回包含结果的数据集。在没有连接池的情况下,每次发出请求时,都会向数据库打开一个新连接,返回结果,然后关闭连接。如果应用程序每秒收到更多可以满足的请求,那么并发打开事务的数量就会增加,因为在任何时候都有多个连接处于活动状态。另外,每个事务都会花费更长的时间,因为它必须打开一个与数据服务器的新连接,这是一个比较大的步骤。
使用连接池,应用程序只会在池中没有新连接时打开新连接。因此,池将在前几个请求时打开一堆新连接,并让它们保持打开状态。现在,当发出新请求时,连接池进程将抓取一个已经打开且之前使用过的连接,而不是打开一个新连接。这会更快,并且在重负载下与数据库的活动连接会更少。当然,当没有人访问服务器时,将会有更多的“等待”连接打开,因为它们被保存在池中。但这通常不是问题,因为无论如何服务器在这种情况下都有大量可用资源。
因此,数据库连接池可用于使您的应用程序更快、更具可扩展性。如果您的流量很少,则它并不重要 - 除非您想尽快返回结果。连接池通常是减少延迟和提高整体性能的整体策略的一部分。
【讨论】: