nodejs数据库连续连接

时间:2018-08-04 23:25:40

标签: node.js database asynchronous database-connection

我有一个文件(db_slave.js),看起来像这样:

var mysql = require('mysql')
var db = require('./db')

var conn = mysql.createConnection({
    host: db.host,
    user: db.user,
    password: db.password
});

conn.connect(function (err) {
    if (err) throw err;
    console.log("Connected to db");
});

module.exports = conn;

所以我希望我的一个文件与数据库建立永久连接,因为许多其他文件将请求该文件执行查询。我的问题是,当其他文件调用该文件时,该文件会建立新的数据库连接还是仅保留一个conn变量?

其他文件将这样称呼该文件:

var sql = require('./db_slave')

sql.query("select 2", function (err, result) {
    if (err) console.log(err)
    console.log(result)
});

那么有多个DB_slave实例或多个连接吗?

有更好的方法吗?

3 个答案:

答案 0 :(得分:0)

应该没问题。在db_slave的第一个require之后,将来的需求将使用缓存的版本,而不重新运行模块代码。有关更多信息,请参见this answer

答案 1 :(得分:0)

NodeJS是一个析因环境,因此,仅在他的第一个require调用时执行模块的代码。所有其他调用都使用第一次执行的结果,即导出的对象。因此,在您的代码中,相同的连接将在您需要此模块的所有地方使用。

答案 2 :(得分:-1)

node.js中的模块被缓存。因此,第一次插入require()时,将加载它们并运行模块中的初始化代码。分配给module.exports的所有内容都会被缓存,随后再次插入模块require()时,只会从模块缓存中获取导出对象,并且不会再次运行您的模块代码。因此,这将适用于创建和共享一个数据库连接。

此设计存在一些问题,使其无法在现实世界中正常工作。

  1. 如果在创建与数据库的连接时出错,则无法将该错误传达回数据库的任何用户(以进行某些智能操作)。

  2. 调用方无法知道何时可以使用连接(connect事件仅在内部)。

在现代的node.js中,可能更有意义的是导出一个诺言,该诺言在连接成功时进行解析,并在出现连接错误时拒绝,然后每次有人在该模块中要求时,他们都可以访问该诺言。他们可以使用.then()获取数据库连接,并使用.catch()获取错误。

例如:

var mysql = require('mysql-promise')
var db = require('./db')

module.exports = mysql.createConnection({
    host: db.host,
    user: db.user,
    password: db.password
}).then(conn => {
    console.log("connected to the DB");
    return conn;
}).catch(err => {
    console.log("error connecting to the DB", err);
    throw err;
});

用法:

require('./db_slave').then(conn => {
    return conn.query("select 2").then(result => {
        console.log(result);
    });
}).catch(err => {
    // handle error here
});