поэтому я совершенно новичок в nodejs и выражаю. Там есть служба, которую я пытаюсь создать, и я заметил, что я не могу просто поддерживать соединение mysql, снова указывая connection.connect()
. Поэтому я придумал этот способ продолжения соединения, но я не был уверен, что это правильный способ сохранить соединение. Может ли кто-нибудь из вас взглянуть на прокомментированную часть в середине кода?
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.
(См. Объединение соединений, для получения более подробной информации)
Вы можете создать соединение, используя метод опроса, используя модуль npm- node-mysql-pool.
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);
});
}
connection.end()
, верно?getConnection
необходимо освободить соединение обратно в пул с помощьюconnection.release();
, Но если вы вызываете только функцию запроса direclty для пула (pool.query
), вам не нужно использоватьrelease
илиend
.