如何在Node JS中处理MySQL连接的正确方法

时间:2019-04-07 14:29:49

标签: mysql node.js

我用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连接和该连接的释放是自动完成的。

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

1 个答案:

答案 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可以很好地总结一下。

  

在软件工程中,连接池是维护的数据库连接的缓存,以便在将来需要对数据库的请求时可以重新使用连接。连接池用于增强在数据库上执行命令的性能。为每个用户打开和维护数据库连接,尤其是对动态数据库驱动的网站应用程序的请求,既昂贵又浪费资源。在连接池中,创建连接后,将其放置在池中,并再次使用它,因此不必建立新的连接。如果使用了所有连接,则会建立一个新连接并将其添加到池中。连接池还减少了用户必须等待建立与数据库的连接的时间。