当使用poolConnection或CreateConnection felixge / node-mysql

我为我的应用程序使用https://github.com/felixge/node-mysql时,为什么使用

db_pool = mysql.createConnection(db); 

要么

 db_pool = mysql.createPool(db); 

有什么区别? 何时使用它们?

单个连接被阻塞。 执行一个查询时,不能执行其他查询。 因此,您的数据库吞吐量可能会降低。

一个池pipe理许多懒洋洋地创build(在felixge的模块)连接。 当一个连接忙于运行查询时,其他连接可用于执行后续查询。 这可以导致应用程序性能的提高,因为它允许多个查询并行运行。

连接池允许您重复使用现有的数据库连接,而不是为Node应用程序的每个请求打开一个新的连接。

许多PHP和.Net人习惯于连接池,因为这些平台中的标准数据访问层自动连接池(取决于你如何访问数据库)。

打开新的数据库连接需要时间和服务器资源。 使用已经存在的连接要快得多,总的来说,如果使用连接池,应用程序在任何时候都需要保持较less的总打开连接数。

node-mysql的连接池function工作得很好,易于使用。 我将池保存在一个全局variables中,并将其传递给任何需要访问数据库的模块。

例如,这里应用程序服务器中的env_settingsvariables包含全局设置,包括活动连接池:

 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方法是asynchronous的,所以当从池中返回现有的打开的连接时,或者如果需要打开一个新的连接,则调用callback函数,并且可以使用连接。 另请注意,使用connection.release()代替正常结束连接。 该版本只允许池回收连接,以便可以重新使用。

这是考虑差异的好方法。 以一个非常简单的应用程序为例,它接受请求并返回一个包含结果的数据集。 如果没有连接池,每次发出请求时都会向数据库打开新的连接,返回结果,然后closures连接。 如果应用每秒获得更多的请求,那么并发打开事务的数量会增加,因为在任何时候都有多个连接处于活动状态。 另外,每个事务将花费更长时间,因为它必须与数据服务器build立新的连接,这是一个相对较大的步骤。

使用连接池时,应用程序将只在池中没有人时打开新的连接。 因此,游泳池将在前几个请求打开一堆新的连接,并打开它们。 现在,当发出新的请求时,连接池过程将获取一个已经打开的连接,而不是打开一个新的连接。 这将会更快,并且在负载较重的情况下,数据库的活动连接将会减less。 当然,当没有人进入服务器时,会有更多的“等待”连接打开,因为它们被保存在池中。 但是这通常不是问题,因为无论如何,服务器都有足够的可用资源。

因此,可以使用数据库连接池来使您的应用程序更快,更具可扩展性。 如果你的stream量很less,那么它就不那么重要了 – 除非你想尽可能快地返回结果。 连接池如果经常是整体策略的一部分,以减less延迟并提高整体性能。