nodejs 连接多个数据库连接池

2025-04-15 11

Image

Node.js 连接多个数据库连接池

在现代应用程序开发中,经常需要同时连接多个数据库以满足不同的业务需求。如何使用 Node.js 实现多个数据库的连接池管理,并提供详细的代码示例和多种解决方案。


解决方案

为了高效管理多个数据库连接,我们可以通过以下步骤实现:

  1. 使用 mysql2pg 等数据库驱动库创建独立的连接池。
  2. 为每个数据库配置单独的连接池实例。
  3. 将这些连接池实例封装到一个统一的管理对象中,便于调用。
  4. 在实际查询时,根据需要选择对应的连接池。

以下是具体的实现方法和代码示例。


方法一:使用 mysql2 驱动连接多个 MySQL 数据库

假设我们需要连接两个 MySQL 数据库(db1db2),可以按照以下步骤实现:

1. 安装依赖

安装 mysql2 包:

bash
npm install mysql2

2. 创建连接池

javascript
const mysql = require('mysql2/promise');</p>

<p>// 创建 db1 的连接池
const poolDb1 = mysql.createPool({
    host: 'localhost',
    user: 'root',
    password: 'password1',
    database: 'db1',
    waitForConnections: true,
    connectionLimit: 10,
    queueLimit: 0
});</p>

<p>// 创建 db2 的连接池
const poolDb2 = mysql.createPool({
    host: 'localhost',
    user: 'root',
    password: 'password2',
    database: 'db2',
    waitForConnections: true,
    connectionLimit: 10,
    queueLimit: 0
});</p>

<p>// 统一管理连接池
const pools = {
    db1: poolDb1,
    db2: poolDb2
};</p>

<p>module.exports = pools;

3. 查询数据

在实际查询时,根据需要选择对应的连接池:

javascript
const pools = require('./pools'); // 引入连接池管理对象</p>

<p>async function queryDb1() {
    const [rows, fields] = await pools.db1.execute('SELECT * FROM users');
    console.log('DB1 Users:', rows);
}</p>

<p>async function queryDb2() {
    const [rows, fields] = await pools.db2.execute('SELECT * FROM products');
    console.log('DB2 Products:', rows);
}</p>

<p>queryDb1();
queryDb2();

方法二:使用 Sequelize ORM 管理多个数据库

Sequelize 是一个强大的 ORM 工具,支持多种数据库(如 MySQL、PostgreSQL、SQLite 等)。我们可以利用它来管理多个数据库连接。

1. 安装依赖

bash
npm install sequelize mysql2

2. 配置多个 Sequelize 实例

javascript
const { Sequelize } = require('sequelize');</p>

<p>// 创建 db1 的 Sequelize 实例
const sequelizeDb1 = new Sequelize('db1', 'root', 'password1', {
    host: 'localhost',
    dialect: 'mysql'
});</p>

<p>// 创建 db2 的 Sequelize 实例
const sequelizeDb2 = new Sequelize('db2', 'root', 'password2', {
    host: 'localhost',
    dialect: 'mysql'
});</p>

<p>// 统一管理 Sequelize 实例
const sequels = {
    db1: sequelizeDb1,
    db2: sequelizeDb2
};</p>

<p>module.exports = sequels;

3. 定义模型并查询数据

javascript
const sequels = require('./sequels'); // 引入 Sequelize 管理对象</p>

<p>// 定义 db1 的用户模型
const User = sequels.db1.define('user', {
    name: Sequelize.STRING,
    email: Sequelize.STRING
});</p>

<p>// 定义 db2 的产品模型
const Product = sequels.db2.define('product', {
    name: Sequelize.STRING,
    price: Sequelize.FLOAT
});</p>

<p>// 同步模型(仅用于测试)
(async () => {
    await User.sync();
    await Product.sync();
})();</p>

<p>// 查询数据
(async () => {
    const users = await User.findAll();
    console.log('DB1 Users:', users);</p>

<pre><code>const products = await Product.findAll();
console.log('DB2 Products:', products);

})();


方法三:动态加载数据库连接池

如果数据库的数量较多或不确定,可以使用动态加载的方式管理连接池。

1. 配置文件

创建一个 JSON 文件存储数据库配置:

json
// databases.json
{
"db1": {
"host": "localhost",
"user": "root",
"password": "password1",
"database": "db1"
},
"db2": {
"host": "localhost",
"user": "root",
"password": "password2",
"database": "db2"
}
}

2. 动态创建连接池

javascript
const mysql = require('mysql2/promise');
const fs = require('fs');
const path = require('path');</p>

<p>// 读取数据库配置
const configPath = path.join(__dirname, 'databases.json');
const configs = JSON.parse(fs.readFileSync(configPath, 'utf-8'));</p>

<p>// 动态创建连接池
const pools = {};
for (const key in configs) {
    pools[key] = mysql.createPool(configs[key]);
}</p>

<p>module.exports = pools;

3. 查询数据

javascript
const pools = require('./pools'); // 引入动态生成的连接池</p>

<p>async function queryDb(key, sql) {
    const [rows, fields] = await pools[key].execute(sql);
    console.log(<code>Query result from ${key}:, rows);
}

queryDb('db1', 'SELECT * FROM users'); queryDb('db2', 'SELECT * FROM products');


三种连接多个数据库的方法:

  1. 使用原生 mysql2 驱动分别创建连接池。
  2. 使用 Sequelize ORM 管理多个数据库实例。
  3. 动态加载数据库配置并创建连接池。

根据项目需求选择合适的方案,能够有效提升代码的可维护性和性能。

1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!cheeksyu@vip.qq.com
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
4. 如果您也有好的资源或教程,您可以投稿发布,成功分享后有积分奖励和额外收入!
5.严禁将资源用于任何违法犯罪行为,不得违反国家法律,否则责任自负,一切法律责任与本站无关

源码下载