连接管理文档
概述
monSQLize 提供 MongoDB 应用常用的连接管理能力,包括安全复用连接、参数校验、资源清理和跨库访问。本文档说明连接 API 与相关配置项。
核心特性
- 安全复用连接:并发调用
connect()会等待同一次连接尝试 - 参数验证:集合名和数据库名会在使用前校验
- 资源清理:
close()会释放客户端资源和运行时缓存 - 错误处理:连接失败后可以安全重试
- 跨库访问:一个实例可以访问其他数据库中的集合
连接管理 API
connect()
建立数据库连接。支持并发调用,确保只建立一个连接。
方法签名
返回值
使用示例
并发调用 connect()
connect() 可以在并发启动任务或请求处理中安全调用。并发调用会等待同一次连接尝试,避免重复打开多个 MongoDB 客户端。
预期行为
- 首个调用方发起连接尝试。
- 其他调用方等待这次尝试完成。
- 连接成功后,所有调用方拿到已连接的 runtime 访问器。
- 如果连接失败,等待中的调用方会收到同一个错误,下一次
connect()调用可以重新尝试。
高并发场景示例
优势
- ✅ 避免连接池耗尽
- ✅ 减少连接开销
- ✅ 防止资源浪费
- ✅ 提高系统稳定性
可接受的集合名和数据库名
collection() 和 db() 会在集合名或数据库名缺失、格式不合法时尽早抛错。
collection() 验证
验证规则:
- 必须是非空字符串
- 不允许
null、undefined、空字符串、纯空格 - 不允许数字、对象等其他类型
db() 验证
重要说明:当传入 name 时,db(name) 会立即验证数据库名。省略参数或传入 undefined 会使用默认数据库;null 在 JavaScript 运行时会触发 INVALID_DATABASE_NAME。
验证规则:
- 如果提供了
databaseName,必须是非空字符串 - 省略参数或传入
undefined会使用默认数据库 - 不允许
null、空字符串或纯空格字符串
错误信息
注意:
db()和db(undefined)会使用创建 MonSQLize 实例时指定的默认数据库名db(null)在 JavaScript 运行时会抛出INVALID_DATABASE_NAME;TypeScript 调用方应直接省略参数- 空字符串
''和纯空格字符串' '也会触发验证错误
close()
关闭数据库连接,正确清理所有资源。
方法签名(close())
close() 释放的资源
- ✅ 关闭 MongoDB 客户端连接
- 释放当前连接尝试状态
- 清理当前 MonSQLize 实例缓存的 Model 实例
- 释放关闭后不应继续保留的 runtime 引用
使用示例(close())
多次连接-关闭循环
注意事项
- 多次调用
close()是安全的,不会抛出错误 - 关闭后再调用
connect()会重新建立连接 - 建议在应用关闭时调用
close()释放资源 - 单元测试中应在
afterEach或after钩子中关闭连接
跨库访问
monSQLize 支持访问不同数据库的集合,无需创建多个实例。
访问其他数据库
跨库访问注意事项
- 所有跨库访问共享同一个 MongoDB 客户端连接
- 缓存键包含数据库名,不同数据库的相同集合有独立缓存
- 跨库查询的配置(maxTimeMS、cache 等)与主数据库配置独立
- 支持在跨库查询中使用所有 monSQLize 功能(缓存、慢查询日志等)
错误处理
连接失败
参数验证失败
最佳实践
1. 单例模式
2. 应用生命周期管理
3. 错误重试
4. 单元测试中的连接管理
useMemoryServer 默认会复用项目内 .cache/mongodb-memory-server/binaries 二进制缓存,并把自动创建的临时数据目录放到 .cache/mongodb-memory-server/db 后在关闭时清理。如需固定目录,可传入 memoryServerOptions.instance.dbPath 或设置 MONSQLIZE_MEMORY_SERVER_DB_DIR。
构造配置
连接生命周期与构造函数配置分开维护。本页只说明 connect()、collection()、db()、use() 与 close()。完整 new MonSQLize(options) 配置请看 完整配置参考,其中覆盖 MongoDB 连接、缓存、Redis、分布式失效、Model、schema-dsl、连接池、同步、慢查询日志、ObjectId 转换与写路径策略。
常见问题
Q: 如何确保只建立一个连接?
A: connect() 方法内置并发锁机制,无论调用多少次,都只建立一个连接。
Q: 什么时候需要调用 close()?
A: 以下场景建议调用 close():
- 应用关闭时
- 单元测试后清理
- 长时间不使用连接时
- 多次连接-关闭循环测试
Q: 跨库访问会建立多个连接吗?
A: 不会。所有跨库访问共享同一个 MongoDB 客户端连接,只是访问不同的数据库。
Q: 连接失败后如何重试?
A: 连接失败后,下一次 connect() 可以重新发起连接: