关于 connection.end() 如何在 node.js mySQL 模块中工作的困惑

Posted

技术标签:

【中文标题】关于 connection.end() 如何在 node.js mySQL 模块中工作的困惑【英文标题】:confusion about how connection.end() works in node.js mySQL module 【发布时间】:2018-12-04 16:54:24 【问题描述】:
const mysql = require('mysql'); 
let connection = mysql.createConnection(...);
        connection.connect((err)=>
           ...
           connection.query((err)=>
           ...
           connection.end(););
        );

使用关闭连接后

connection.end()

,如果我想使用相同的凭据再次查询数据库,是否需要通过调用建立新连接

mysql.createConnection(...)

或者我可以通过调用来重复使用相同的连接

connection.connect(...)

一点背景知识:我正在将一个 angular/node.js 应用程序部署到一个共享托管网站,并且该网络主机对 mySQL 数据库的最大并发连接数限制为 25 个,因此我需要确保我关闭了一个连接在用户进行查询后正确。我不确定是否可以在关闭该连接后重用由 mysql.createConnection(...) 创建的连接,还是需要创建一个全新的连接。

【问题讨论】:

你会想要一个游泳池。将其配置为不使用超过 25 个连接。 【参考方案1】:

您可以使用一个全局连接从 db 获取数据。

如果你在单个文件上工作,那么你可以写成

app.js 只有一个文件

 var mysql      = require('mysql');
 var connection = mysql.createConnection(...);

    connection.query('SELECT 1', function (error, results, fields) 
     if (error) throw error;
   // connected!
  );

如果您想在多个文件中使用相同的连接,则可以编写为app.js

 app.use(  
    connection(mysql, 
         host: xxxxx, 
         user: 'root',
         password : xxxx, 
         port : 3306, 
         database:dbname

     ,'pool'),  
   );

  var oem = require('./routes/type');
  app.get('/api/oemtype',oem.type);

对于第二个文件 type.js

   exports.type = function(req, res)

     req.getConnection(function(err,connection)

      var query = connection.query('SELECT * FROM type',function(err,rows)
      
          if(err)
          res.json(
            status:0
        );

              res.send(rows);
         res.render('customers',page_title:"Customers - Node.js",data:rows);


       );

  );

   ;

无需使用connection.end()。

【讨论】:

我将应用程序部署到的 Web 主机对 mySQL 数据库的最大并发连接数限制为 25 个。不调用connection.end()会不会导致连接挂起,从而导致问题达到最大极限? 如果每次都结束连接,那么mysql每次都会创建新连接,这会降低应用程序和mysql的性能。最好使用池连接。 池是否为所有用户创建一个池?例如,如果我将 connectionLimit 设置为 25(如 var pool=mysql.createPool(connectionLimit:10, host:...); 这将为每个用户创建一个 25 的连接池还是创建一个连接所有用户的 25 个池? 抱歉耽搁了,将为所有 25 个用户创建池,而不是为每个用户创建池。在查询工作完成后,您可以使用 connection.release() 而不是结束方法。检查这个***.com/questions/18496540/… 谢谢!这对我来说是新知识,我会自己做更多的研究:)

以上是关于关于 connection.end() 如何在 node.js mySQL 模块中工作的困惑的主要内容,如果未能解决你的问题,请参考以下文章

如何结束 mysql 连接而不让它挂在 NodeJS 中?

关于如何解决稀疏OLS - 如何在Matlab中应用`l1`最小化(教育目的)

关于ubuntu下 shell

如何删除关于 n_estimators 的未来警告将从 0.20 版本中的 10 更改为 0.22 中的 100?

关于数组中的就地合并

关于如何分析排查解决Redis变慢问题