在具有池化连接的nodejs中编写mysql查询

时间:2015-08-09 18:24:58

标签: mysql node.js

想了解使用连接池在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()。

1 个答案:

答案 0 :(得分:0)

您的代码看起来很好(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();
      });
    });
  });
});