我用NodeJS构建了一个程序,多个用户同时访问它,并执行许多查询MySQL数据库的操作。
我的方法很简单。我只打开一个连接时,应用程序是启动,并离开它的方式。
const dbConfig = require('./db-config');
const mysql = require('mysql');
// Create mySQL Connection
const db = mysql.createConnection({
host: dbConfig.host,
user: dbConfig.user,
password: dbConfig.password,
database: dbConfig.database,
multipleStatements: true
});
// Connect MySQL
db.connect((err) => {
if (err) {
throw err;
} else {
console.log('MySQL connected!');
}
});
module.exports = db;然后,每当程序需要查询数据库时,我都会这样做
db.query('query_in_here', (error, result) => {
*error_handling_and_doing_stuff*
}当有很长一段时间(几个小时)没有人访问这个应用程序时,我遇到了麻烦。
因为当这种情况发生时,我认为连接是自动关闭的。然后,当用户试图访问应用程序时,我在控制台中看到连接超时。
我的第一个想法是太过处理断开和重新连接。但是,这让我思考如果这是正确的方法。
我应该用池连接代替吗?因为如果我只保留一个连接,就意味着两个用户不能同时查询数据库?
我试图理解具有池连接的教程,但无法确定何时创建新连接以及何时结束它们。
更新1
而不是在应用程序启动时创建一个连接,而是更改为创建一个池连接。
const dbConfig = require('./db-config');
const mysql = require('mysql');
// Create mySQL Connection
const db = mysql.createPool({
host: dbConfig.host,
user: dbConfig.user,
password: dbConfig.password,
database: dbConfig.database,
multipleStatements: true
});
module.exports = db;当我现在用“db.query(.)”mysql连接和该连接的发布是自动完成的。
所以,它应该解决我的问题,但我不知道这是否正确的方法。
发布于 2019-04-07 14:44:53
我应该用池连接代替吗?
是的你应该去。mysql模块支持联营的开箱即用.
var mysql = require('mysql');
var pool = mysql.createPool({
connectionLimit : 10,
host : 'example.org',
user : 'bob',
password : 'secret',
database : 'my_db'
});
pool.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
// should actually use an error-first callback to propagate the error, but anyway...
if (error) return console.error(error);
console.log('The solution is: ', results[0].solution);
});你不应该知道池是怎么运作的。它是从你这里抽象出来的。您所需要做的就是使用pool来分派查询。它如何在内部工作并不是你需要理解的事情。
您应该注意的是connectionLimit配置选项。这应该与您的MySQL服务器连接限制相匹配(减去1,以防您想在应用程序运行时自己连接它),否则您将得到“太多的联系”错误。MySQL的默认连接限制为100,因此我建议您将connectionLimit设置为99。
因为如果我只保留一个连接,就意味着两个用户不能同时查询数据库?
如果没有池,就不能并行地处理多个用户请求。对于任何非业余的、数据驱动的应用程序来说,这都是必须的。
现在,如果您真的想知道连接池是如何工作的,这个文章可以很好地总结它。
在软件工程中,连接池是维护的数据库连接的缓存,以便在需要对数据库的未来请求时重用这些连接。连接池用于提高在数据库上执行命令的性能。为每个用户打开和维护数据库连接,特别是对动态数据库驱动的网站应用程序的请求,代价高昂,浪费资源。在连接池中,在创建连接之后,将它放置在池中,并再次使用它,这样就不必建立新的连接。如果正在使用所有连接,则将创建一个新连接并将其添加到池中。连接池还减少了用户必须等待建立到数据库连接的时间。
https://stackoverflow.com/questions/55560039
复制相似问题