在 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'
});
});
您可以使用 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);
});
}
在这种情况下,您应该考虑使用 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
为池定义连接限制,如果您想 control/limit mysql 服务器上的负载,这会很方便。
(有关详细信息,请参阅 Pooling connections)
所以我对 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'
});
});
您可以使用 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);
});
}
在这种情况下,您应该考虑使用 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
为池定义连接限制,如果您想 control/limit mysql 服务器上的负载,这会很方便。
(有关详细信息,请参阅 Pooling connections)