【问题标题】:When use poolConnection or CreateConnection felixge/node-mysql当使用 poolConnection 或 CreateConnection felixge/node-mysql
【发布时间】:2014-01-10 13:35:18
【问题描述】:

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

db_pool = mysql.createConnection(db);

db_pool = mysql.createPool(db);

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

【问题讨论】:

    标签: mysql node.js


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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() 而不是正常结束连接。释放只是允许池收回连接,以便可以重复使用。

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

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

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

      【讨论】:

      • 您能否描述一下 php mysql 创建连接与节点 js 连接池的不同之处。 php会自动处理池请求的数量吗? nodejs mysql连接池和php mysql连接哪个更好?
      猜你喜欢
      • 2011-07-01
      • 2013-03-25
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-28
      • 1970-01-01
      相关资源
      最近更新 更多