目前我正在使用Node.js中的MySQL库,但我对使用此库的正确/最有效方法有疑问。
根据w3schools,制作单个查询的正确方法是使用这样的代码
var mysql = require('mysql');
var con = mysql.createConnection({
host: "localhost",
user: "yourusername",
password: "yourpassword",
database: "mydb"
});
con.connect(function(err) {
if (err) throw err;
con.query("SELECT * FROM customers", function (err, result, fields) {
if (err) throw err;
console.log(result);
});
});
然而,假设我想进行多个查询,这些查询将由事件执行,例如我将如何处理?我应该创建一个“初始化”函数,该函数会在程序运行时立即执行吗?
var mysql = require('mysql');
var database;
//Initialise database
function setupDatabase() {
database = mysql.createConnection({
host: token.host,
user: token.user,
password: token.password,
database: token.database,
port: token.port
});
}
//Imagine this could be called at any time after execution
function event() {
if(database != null) {
database.connect(function(err) {
if (err) throw err;
database.query("SELECT * FROM customers", function (err, result, fields) {
if (err) throw err;
console.log(result);
});
});
}
}
每次进行查询时都必须连接数据库,还是可以将“database.connect”调用添加到我的setupDatabase函数中?
var mysql = require('mysql');
var database;
//Initialise database
function setupDatabase() {
database = mysql.createConnection({
host: token.host,
user: token.user,
password: token.password,
database: token.database,
port: token.port
});
if(database != null) {
database.connect(function(err) {
if (err) throw err;
});
}
}
//Imagine this could be called at any time after execution
function event() {
if(database != null) {
database.query("SELECT * FROM customers", function (err, result, fields) {
if (err) throw err;
console.log(result);
});
}
}
我主要担心的是每次进行查询时调用con.connect函数都会很慢,尽管这些是异步的,但我希望能够使用正确/最有效的方法。在最后两个代码片段中,我可以随时纠正我的任何错误。到目前为止,我只测试了第一个代码片段。
答案 0 :(得分:3)
每个应用程序实时只需要建立一次数据库连接(除非你有断开连接)。然后,您可以根据需要获得尽可能多的查询。
只需将数据库连接例程放在sepparate文件中,然后在应用程序初始化步骤中将其命名。
// mysql.js
const mysql = require('mysql');
module.exports = mysql.createConnection({
host: "localhost",
user: "yourusername",
password: "yourpassword",
database: "mydb"
});
或者在需要数据库连接的任何地方需要它 - 它将返回连接的数据库对象,而不会一次又一次地重新运行该代码。
// inex.js
const databse = require('./mysql')
database.query("SELECT * FROM customers")
答案 1 :(得分:1)
我创建了一个文件,其中包含一个包含池的函数,并像这样处理与数据库的连接
let _this = {};
let POOL = null;
function getPool() {
return new Promise((resolve, reject) => {
if(POOL != null) {
resolve(POOL);
} else {
//create connection pool
POOL = connectionPool;
resolve(POOL);
}
});
}
function closePool(){
// close pool here
}
_this.getPool = getPool;
_this.closePool = closePool;
module.exports = _this;
现在,您可以致电getPool()
并重新获取可以执行查询的连接池。