连接池配置与优化
连接池的基本概念
连接池是数据库连接管理的核心机制,通过预先建立并维护一定数量的数据库连接,避免频繁创建和销毁连接带来的性能开销。在Mongoose中,连接池的配置直接影响应用的并发处理能力和响应速度。
典型连接池包含以下关键参数:
poolSize
:连接池中保持的最大连接数minPoolSize
:连接池保持的最小连接数maxPoolSize
:连接池能扩展到的最大连接数maxIdleTimeMS
:连接在池中的最大空闲时间
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/mydb', {
poolSize: 10, // 默认值5
minPoolSize: 2, // 最小保持2个连接
maxPoolSize: 20, // 最大扩展到20连接
maxIdleTimeMS: 30000 // 30秒空闲后释放
});
连接池参数调优
确定最佳poolSize
poolSize的设置需要根据应用的实际负载进行调整:
- 低并发应用:5-10个连接通常足够
- 中等并发:10-30个连接
- 高并发场景:需要压力测试确定
// 生产环境推荐配置示例
const prodConfig = {
poolSize: 15,
minPoolSize: 5,
maxPoolSize: 50,
socketTimeoutMS: 60000,
connectTimeoutMS: 30000
};
连接超时控制
关键超时参数需要根据网络状况调整:
connectTimeoutMS
:建立TCP连接的超时(默认30000ms)socketTimeoutMS
:单个操作超时时间(默认0,无超时)
// 超时配置示例
mongoose.connect(uri, {
connectTimeoutMS: 5000, // 5秒连接超时
socketTimeoutMS: 45000 // 45秒操作超时
});
高级连接池策略
动态扩容机制
Mongoose 4.11+支持动态连接池扩容:
// 动态扩容配置
{
autoReconnect: true,
bufferMaxEntries: 0, // 连接不可用时立即返回错误
bufferCommands: false // 禁止命令缓冲
}
多节点集群配置
对于副本集或分片集群,需要特殊配置:
mongoose.connect('mongodb://host1:27017,host2:27017/mydb', {
replicaSet: 'myReplicaSet',
poolSize: 10,
readPreference: 'secondaryPreferred'
});
监控与诊断
连接状态监控
通过事件监听实现连接池监控:
const conn = mongoose.connection;
conn.on('connected', () => {
console.log(`活跃连接数:${conn.poolSize}`);
});
conn.on('disconnected', () => {
console.warn('数据库连接断开');
});
性能指标收集
使用Mongoose内置统计:
// 获取连接池统计信息
setInterval(() => {
const stats = mongoose.connection.base.stats();
console.log('连接池状态:', {
available: stats.available,
total: stats.total,
waiting: stats.waiting
});
}, 5000);
常见问题解决方案
连接泄漏处理
典型泄漏场景及修复:
// 错误示例:未关闭查询游标
const leak = async () => {
const cursor = Model.find().cursor();
// 忘记调用cursor.close()
};
// 正确做法
const safe = async () => {
const cursor = Model.find().cursor();
try {
for await (const doc of cursor) {
// 处理文档
}
} finally {
await cursor.close();
}
};
连接风暴预防
突发流量下的保护措施:
mongoose.connect(uri, {
maxPoolSize: 100,
waitQueueTimeoutMS: 5000, // 等待队列超时
retryWrites: false // 禁用自动重试
});
生产环境最佳实践
连接健康检查
定期心跳检测:
function checkConnection() {
return mongoose.connection.db.admin().ping();
}
// 每30秒执行一次健康检查
setInterval(async () => {
try {
await checkConnection();
} catch (err) {
console.error('数据库连接异常', err);
// 触发重连逻辑
}
}, 30000);
多应用共享配置
微服务架构下的连接管理:
class DBConnectionManager {
constructor() {
this.connections = new Map();
}
getConnection(dbName) {
if (!this.connections.has(dbName)) {
const conn = mongoose.createConnection(`mongodb://localhost/${dbName}`, {
poolSize: 5,
bufferCommands: false
});
this.connections.set(dbName, conn);
}
return this.connections.get(dbName);
}
}
性能调优案例
电商场景优化
高并发下单系统配置:
// 订单服务专用连接
const orderDB = mongoose.createConnection('mongodb://cluster1/db_orders', {
poolSize: 30,
minPoolSize: 10,
readPreference: 'primary',
w: 'majority',
j: true
});
// 商品查询专用连接
const productDB = mongoose.createConnection('mongodb://cluster2/db_products', {
poolSize: 20,
minPoolSize: 5,
readPreference: 'secondary'
});
物联网数据处理
高频写入场景配置:
const iotConnection = mongoose.createConnection('mongodb://iot-cluster/db_sensors', {
poolSize: 50,
maxPoolSize: 200,
autoReconnect: true,
bufferMaxEntries: 1000,
connectTimeoutMS: 10000
});
// 批量写入优化
iotConnection.on('open', () => {
iotConnection.set('bufferCommands', true);
iotConnection.set('bufferTimeoutMS', 500);
});
本站部分内容来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn
上一篇:连接MongoDB数据库
下一篇:处理连接错误与重连机制