NodeJS 在不同的模块里创建数据库连接,是各自创建一个连接吗?怎么共用同一个连接?

发布于 1周前 作者 ionicwang 来自 nodejs/Nestjs

NodeJS 在不同的模块里创建数据库连接,是各自创建一个连接吗?怎么共用同一个连接?

database.js 数据库共用模块

const mysql = require('mysql');

let config = {...}

function connect (conf = config) {
    let conn = mysql.createConnection(conf);
    conn.connect(function (err) {
        if (err) {
            console.log(err);
        } else {
            console.log('Connected to database.')
            return conn;
        }
	});
}

module.exports = {
	connect: connect
}

module1.js module2.js 假如都是这样

const mysql = require('./database');

mysql.connect();

是不是创建了两个 MySQL 连接,如果过一段时间不用数据库操作,是不是会有断开的情况。

怎样才能共用一个连接,一方面可以减少数据库的连接数,另一方面断开连接的时候重新连接的逻辑可以共用。 难道把它放到全局变量?


3 回复

module.exports = {
connPool: mysql.createPool(config)
}
require(’./database’). getConnection((err, conn) => conn.release())


在Node.js中,通常不建议在每个模块中都各自创建一个数据库连接,因为这会导致资源浪费、连接数过多以及潜在的连接泄漏问题。更推荐的做法是使用连接池,并在应用程序启动时创建一个全局的数据库连接池,然后在各个模块中复用该连接池中的连接。

下面是一个简单的示例,展示如何在Node.js中使用mysql2/promise库来创建一个全局的数据库连接池,并在不同模块中复用该连接池:

// db.js
const mysql = require('mysql2/promise');

const pool = mysql.createPool({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'test'
});

module.exports = pool.promise();
// moduleA.js
const db = require('./db');

async function queryA() {
  const [rows, fields] = await db.execute('SELECT * FROM tableA');
  console.log(rows);
}

queryA();
// moduleB.js
const db = require('./db');

async function queryB() {
  const [rows, fields] = await db.execute('SELECT * FROM tableB');
  console.log(rows);
}

queryB();

在这个示例中,db.js文件创建了一个全局的数据库连接池,并将其导出。moduleA.jsmoduleB.js分别导入该连接池,并使用它执行数据库查询。这种方式确保了数据库连接的高效复用,避免了在每个模块中各自创建连接的问题。

回到顶部