首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确处理Node中的MySQL连接

问如何正确处理Node中的MySQL连接
EN

Stack Overflow用户
提问于 2019-04-07 14:29:48
回答 1查看 3.4K关注 0票数 2

我用NodeJS构建了一个程序,多个用户同时访问它,并执行许多查询MySQL数据库的操作。

我的方法很简单。我只打开一个连接时,应用程序是启动,并离开它的方式。

代码语言:javascript
复制
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;

然后,每当程序需要查询数据库时,我都会这样做

代码语言:javascript
复制
db.query('query_in_here', (error, result) => {
         *error_handling_and_doing_stuff*
}

当有很长一段时间(几个小时)没有人访问这个应用程序时,我遇到了麻烦。

因为当这种情况发生时,我认为连接是自动关闭的。然后,当用户试图访问应用程序时,我在控制台中看到连接超时。

我的第一个想法是太过处理断开和重新连接。但是,这让我思考如果这是正确的方法。

我应该用池连接代替吗?因为如果我只保留一个连接,就意味着两个用户不能同时查询数据库?

我试图理解具有池连接的教程,但无法确定何时创建新连接以及何时结束它们。

更新1

而不是在应用程序启动时创建一个连接,而是更改为创建一个池连接。

代码语言:javascript
复制
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连接和该连接的发布是自动完成的。

所以,它应该解决我的问题,但我不知道这是否正确的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-07 14:44:53

我应该用池连接代替吗?

是的你应该去。mysql模块支持联营的开箱即用.

代码语言:javascript
复制
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。

因为如果我只保留一个连接,就意味着两个用户不能同时查询数据库?

如果没有池,就不能并行地处理多个用户请求。对于任何非业余的、数据驱动的应用程序来说,这都是必须的。

现在,如果您真的想知道连接池是如何工作的,这个文章可以很好地总结它。

在软件工程中,连接池是维护的数据库连接的缓存,以便在需要对数据库的未来请求时重用这些连接。连接池用于提高在数据库上执行命令的性能。为每个用户打开和维护数据库连接,特别是对动态数据库驱动的网站应用程序的请求,代价高昂,浪费资源。在连接池中,在创建连接之后,将它放置在池中,并再次使用它,这样就不必建立新的连接。如果正在使用所有连接,则将创建一个新连接并将其添加到池中。连接池还减少了用户必须等待建立到数据库连接的时间。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55560039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档