概述
单一连接模式和连接池模式是数据库连接的两种主要方式:
单一连接模式:
- 优点:实现简单,适合小型应用
- 缺点:每次请求都需要创建新连接,连接创建和销毁开销大,并发性能差,容易出现连接泄露
连接池模式:
- 优点:预先创建多个连接并复用,减少连接创建和销毁的开销,提高并发性能,自动管理连接生命周期
- 缺点:需要额外的内存维护连接池,配置相对复杂
在生产环境中,特别是并发请求较多的情况下,强烈建议使用连接池模式,可以显著提升应用性能和稳定性。
下面是这两种不同模式的写法
单一连接模式:
const mysql = require('mysql2');const db = mysql.createConnection({host: process.env.DB_HOST,user: process.env.DB_USER,password: process.env.DB_PASSWORD,database: process.env.DB_NAME
});db.connect((err) => {if (err) {console.error('数据库连接失败:', err);return;}console.log('成功连接到数据库');
});module.exports = db;
连接池模式:
// config/db.js
const mysql = require('mysql2');const pool = mysql.createPool({host: process.env.DB_HOST,user: process.env.DB_USER,password: process.env.DB_PASSWORD,database: process.env.DB_NAME,waitForConnections: true,connectionLimit: 10,queueLimit: 0,enableKeepAlive: true,keepAliveInitialDelay: 0
});// 测试连接池
pool.getConnection((err, connection) => {if (err) {console.error('数据库连接池初始化失败:', err);return;}console.log('数据库连接池初始化成功');connection.release();
});// 优雅关闭连接池
process.on('SIGINT', () => {pool.end(err => {if (err) {console.error('关闭连接池时发生错误:', err);} else {console.log('数据库连接池已关闭');}process.exit(err ? 1 : 0);});
});module.exports = pool.promise();
配置参数:
- 最大连接数限制为10
- 启用连接等待机制
- 开启keepAlive保持连接活跃