【问题标题】:Writing mysql queries in nodejs with pooling connections使用池连接在nodejs中编写mysql查询
【发布时间】:2015-11-01 15:40:33
【问题描述】:

想知道在带有连接池的nodejs中编写mysql查询的最佳实践。找到了一些相关的线程。但他们都没有回答确切的问题。所以开始一个新的。

var mysql = require('mysql');
var pool  = mysql.createPool(...);

pool.getConnection(function(err, connection) {
  // insert into  first table

  connection.query( 'Insert into table values(....)', function(err, rows) {

   //get the auto incremented value from first insert and use it in the second insert

    connection.query("insert into table2 values(rows.insertID,..)",function(err,rows){

    //release the connection to pool after performing all the inserts

     connection.release();

    });
  });
}); ` 

疑问:

  • 这是编写这些查询的正确方法吗
  • 使用 pool 时需要使用 end() 。我的理解是,当我们使用 release() 函数时,连接将回到池中,我们可以重用它。那么是否需要在任何地方使用 end()。

【问题讨论】:

    标签: mysql node.js


    【解决方案1】:

    您的代码看起来不错(IE 打开一个池,多个查询同时获取上一个查询的 insertID)。使用池,connection.release() 将“关闭”会话并返回池。不需要connection.end()。

    补充:

    IMO,如果您的操作会导致阻塞其他用户(主要是大量读取或大量写入),则使用连接池。由于您正在插入数据(假设这会相对较快),您可以尝试使用Transactions。

    Transactions 提供对查询进行故障保护的方法(提高数据库的完整性)。如果您使用事务,您可以在提交到数据库之前检查是否调用了所有内容(您必须选择回滚更改)。

    var mysql = require('mysql');
    var connection = mysql.createConnection({...});
    
    // Open it up
    connection.connect();
    
    connection.beginTransaction(function(err){
      if(err) { throw err; }
    
      // Use connection.escape() to sanitize user input
      var insertQuery = 'Insert into table values(....)';
    
      connection.query(insertQuery, function(err, result) {
        if (err) {
          return connection.rollback(function() {
            throw err;
          });
        }
        //get the auto incremented value from first insert and use it in the second insert
        var rowId = result.insertId;
        var insertQuery2 = "insert into table2 values(" + rowId + ",..)";
    
        connection.query(insertQuery2, function(err, result){
          if(err) {
            return connection.rollback(function(){
              throw err;
            });
          }
          connection.commit(function(err){
            if (err) {
              return connection.rollback(function() {
                throw err;
              });
            }
            // Close it up
            connection.end();
          });
        });
      });
    });
    

    【讨论】:

    • 感谢您的回复。将尝试在我们的应用程序中使用事务。我们也可以在池中使用事务吗?
    • 假设是,因为它使用连接。你将不得不 release() 而不是 end()。
    猜你喜欢
    • 2019-05-29
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    相关资源
    最近更新 更多