繁体   English   中英

在Express上保持mysql连接

[英]Keeping mysql connection on Express

所以我对nodejs和express很陌生。 我正在尝试创建一项服务,并且我注意到不能通过再次声明connection.connect()来简单地保持mysql连接。 所以我想出了这种继续连接的方法,但是我不确定这是否是保持连接的正确方法。 你们中的任何人都可以看看代码中间的注释部分吗?

app.get('/keyboard', function(req, res){
    connection.connect();
    connection.query("SELECT `hour` from timetable WHERE `reserved` = '0'", function(err, rows, fields){

            if(err) throw err;
            var buttons = [];
            for(var i = 0; i < rows.length; i++){

                    buttons.push(rows[i].hour);
            }

            console.log("available time: " + buttons);

            var return_data = {

                    "type"    : "buttons",
                    "buttons" : buttons
            };
            //console.log(return_data);
            res.send(return_data);

    });

    connection.end(); // connection ends here
    //connection.connect() doesn't create a new connection.
    connection = mysql.createConnection({ // another connection like this?
            host     : 'localhost',
            user     : 'user',
            password : 'pw',
            database : 'db'
    });
});

在这种情况下,您应该考虑使用mysql库提供的池功能。 池将接管任务以管理连接。

var mysql = require('mysql');
var pool = mysql.createPool({ // another connection like this?
  host: 'localhost',
  user: 'user',
  password: 'pw',
  database: 'db',
  connectionLimit : 10 // its depends on requirement  
});


app.get('/keyboard', function(req, res) {
  pool.query("SELECT `hour` from timetable WHERE `reserved` = '0'", function(err, rows, fields) {

    if (err) throw err;

    var buttons = [];
    for (var i = 0; i < rows.length; i++) {
      buttons.push(rows[i].hour);
    }

    console.log("available time: " + buttons);

    var return_data = {

      "type": "buttons",
      "buttons": buttons
    };
    //console.log(return_data);
    res.send(return_data);
  });
})

您可以像常规连接一样使用池,不同之处在于mysql模块将在池对象的每次调用时从其池中请求一个新的连接,并在查询完成后释放该连接。

如果您需要使用事务,而您需要执行另一种针对每个连接状态的多次查询,则这一点很重要。 例如,这样的操作可能会失败,或发生意外行为:

pool.query("START TRANSACTION")
pool.query("SELECT ...") // some query
pool.query("COMMIT")

对于这种情况,您需要以这种方式编写,但是在那里您需要使用connection.release();将连接释放回池中connection.release();

pool.getConnection(function(err, connection) {
  connection.query("START TRANSACTION")
  pool.query("SELECT ...") // some query
  connection.query("COMMIT", function() {
    connection.release();
  })
});

您可以定义使用连接池的限制connectionLimit ,如果你想控制/限制MySQL服务器的负载这可以成为得心应手。

(有关更多详细信息,请参见池连接 )。

您可以使用node-mysql-pool npm模块使用轮询方法创建连接。

var MySQLPool = require("mysql-pool").MySQLPool;
var pool = new MySQLPool({
  poolSize: 4,// it can be number of connections
  user:     'root',
  password: 'root',
  database: 'test'
});

pool.query("SELECT 'Hello, World!' AS hello", function(err, rows, fields) {
  if(err) throw err;
  console.log(rows[0].hello);
});

for(var i = 0; i < 10; ++i) {
  pool.query("SELECT SLEEP(2), ? AS i", [i], function(err, rows, fields) {
    if(err) throw err;
    console.log("Slept: " + rows[0].i);
  });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM