当使用poolConnection或CreateConnection felixge / node-mysql时

时间:2013-12-21 23:59:07

标签: mysql node.js

我将https://github.com/felixge/node-mysql用于我的应用程序 何时以及为何使用

db_pool = mysql.createConnection(db);

db_pool = mysql.createPool(db);

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

2 个答案:

答案 0 :(得分:21)

单个连接正在阻止。执行一个查询时,它无法执行其他查询。因此,您的数据库吞吐量可能会降低。

池管理许多延迟创建(在felixge的模块中)连接。当一个连接忙于运行查询时,其他连接可用于执行后续查询。这可以提高应用程序性能,因为它允许并行运行多个查询。

答案 1 :(得分:5)

连接池允许您重用现有的数据库连接,而不是为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()而不是正常结束连接。该版本只允许池取回连接,以便可以重复使用。

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

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

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