【问题标题】:confusion about how connection.end() works in node.js mySQL module关于 connection.end() 如何在 node.js mySQL 模块中工作的困惑
【发布时间】: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 个连接。

标签: javascript mysql sql node.js angular


【解决方案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() 而不是结束方法。检查这个stackoverflow.com/questions/18496540/…
  • 谢谢!这对我来说是新知识,我会自己做更多的研究:)
猜你喜欢
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
相关资源
最近更新 更多