Node.js 连接多个数据库连接池
在现代应用程序开发中,经常需要同时连接多个数据库以满足不同的业务需求。如何使用 Node.js 实现多个数据库的连接池管理,并提供详细的代码示例和多种解决方案。
解决方案
为了高效管理多个数据库连接,我们可以通过以下步骤实现:
- 使用
mysql2
或pg
等数据库驱动库创建独立的连接池。 - 为每个数据库配置单独的连接池实例。
- 将这些连接池实例封装到一个统一的管理对象中,便于调用。
- 在实际查询时,根据需要选择对应的连接池。
以下是具体的实现方法和代码示例。
方法一:使用 mysql2 驱动连接多个 MySQL 数据库
假设我们需要连接两个 MySQL 数据库(db1
和 db2
),可以按照以下步骤实现:
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');
三种连接多个数据库的方法:
- 使用原生
mysql2
驱动分别创建连接池。 - 使用 Sequelize ORM 管理多个数据库实例。
- 动态加载数据库配置并创建连接池。
根据项目需求选择合适的方案,能够有效提升代码的可维护性和性能。