概述
单一连接模式和连接池模式是数据库连接的两种主要方式:
单一连接模式:
- 优点:实现简单,适合小型应用
- 缺点:每次请求都需要创建新连接,连接创建和销毁开销大,并发性能差,容易出现连接泄露
连接池模式:
- 优点:预先创建多个连接并复用,减少连接创建和销毁的开销,提高并发性能,自动管理连接生命周期
- 缺点:需要额外的内存维护连接池,配置相对复杂
在生产环境中,特别是并发请求较多的情况下,强烈建议使用连接池模式,可以显著提升应用性能和稳定性。
下面是这两种不同模式的写法
单一连接模式:
javascript
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;
连接池模式:
javascript
// 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保持连接活跃