我用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连接和该连接的释放是自动完成的。
因此,它应该可以解决我的问题,但是我不知道这是否是正确的方法。
答案 0 :(得分:1)
我应该改用池连接吗?
是的,应该。 mysql模块开箱即用地支持Pooling。
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) {
if (error) throw error;
console.log('The solution is: ', results[0].solution);
});
您不应该知道池的工作方式。是您抽象。您需要做的就是使用pool
调度查询。您不需要了解它如何在内部工作。
您应该注意的是connectionLimit
配置选项。这应该与您的MySQL服务器连接限制相匹配(如果您想在应用程序运行时自行连接,请减一),否则将出现"too many connections"错误。 MySQL的默认连接限制为100,因此建议您将connectionLimit
设置为99
。
因为如果我仅保留一个连接,这意味着两个用户无法同时查询数据库?
没有缓冲,您不能并行服务多个用户请求。对于任何非爱好数据驱动的应用程序,这都是必须。
现在,如果您真的想知道连接池的工作原理,那么此article可以很好地总结一下。
在软件工程中,连接池是维护的数据库连接的缓存,以便在将来需要对数据库的请求时可以重新使用连接。连接池用于增强在数据库上执行命令的性能。为每个用户打开和维护数据库连接,尤其是对动态数据库驱动的网站应用程序的请求,既昂贵又浪费资源。在连接池中,创建连接后,将其放置在池中,并再次使用它,因此不必建立新的连接。如果使用了所有连接,则会建立一个新连接并将其添加到池中。连接池还减少了用户必须等待建立与数据库的连接的时间。