javascript - 在 Express 上保持 mysql 连接

标签 javascript mysql node.js express connection-pooling

所以我对 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();将连接释放回池中

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

您可以使用connectionLimit定义池的连接限制,如果您想控制/限制mysql服务器上的负载,这会变得很方便。

(有关更多详细信息,请参阅 Pooling connections)

关于javascript - 在 Express 上保持 mysql 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47971326/

相关文章:

javascript - 如何使用javascript转换鼠标事件和触摸事件

javascript - 在 ngfor 中交换数据后获取新数组

php - 将图像插入 MySQL 数据库

javascript - 为什么在这个 npm start 脚本中调用 tsc 两次?

node.js - 找不到 NodeJS CircleCI `GLIBCXX_3.4.21'

node.js - Elasticsearch基于时间的排序无法正常工作

javascript - 仅滑动图像 css3 或需要 javascript?

java - 使用jpa从同一个选择同一个表mariadb的表中删除

mysql - "key buffer size"和 "total MyISAM indexes"单位大小是什么意思?

javascript - 引用错误: Schema is not defined