Mongo Atlas M0层使用CSFLE时连接数超标相关问题咨询
问题根源说明
你遇到的连接数超限和超时问题,核心原因是每次操作都新建MongoClient实例,每个实例会维护独立的连接池,短时间内创建大量实例会快速占满M0集群500的连接上限,新的连接请求无法分配资源就会抛出超时错误。
问题1:CSFLE场景下是否可以使用单例MongoClient复用连接
可以,而且这是官方推荐的最佳实践。
CSFLE的SchemaMap参数支持同时配置多个集合的加密规则,以数据库名.集合名作为key,每个key对应不同集合的加密schema即可。你可以把3个集合的加密配置全部放到同一个SchemaMap中,只需要初始化一次MongoClient作为全局单例复用,所有加密操作都可以通过这个单例完成,不会出现加密规则冲突的问题。
示例代码(C#):
// 分别定义三个集合的加密Schema var collectionASchema = BsonDocument.Parse("{ /* 集合A的加密配置 */ }"); var collectionBSchema = BsonDocument.Parse("{ /* 集合B的加密配置 */ }"); var collectionCSchema = BsonDocument.Parse("{ /* 集合C的加密配置 */ }"); var autoEncryptionOptions = new AutoEncryptionOptions( keyVaultNamespace: "encryption.__keyVault", kmsProviders: kmsProviders, schemaMap: new Dictionary<string, BsonDocument> { { "业务库名.collectionA", collectionASchema }, { "业务库名.collectionB", collectionBSchema }, { "业务库名.collectionC", collectionCSchema } }); var clientSettings = MongoClientSettings.FromConnectionString("你的Atlas连接串"); clientSettings.AutoEncryptionOptions = autoEncryptionOptions; // 全局只初始化一次,作为单例复用 var mongoClient = new MongoClient(clientSettings);
问题2:MongoClient实例创建后是否支持修改连接配置
不支持,MongoClient的设计是不可变对象,所有配置在初始化完成后就为只读状态,无法动态修改。
如果确实存在无法将所有加密规则合并到同一个SchemaMap的特殊场景,你可以根据配置的数量,全局初始化最多3个MongoClient静态实例,分别对应3个集合的加密配置,全局复用这3个实例即可,同样可以把连接数控制在极低水平,不会触发M0的连接阈值。
额外报错处理
你错误日志中出现的localhost:27020连接被拒绝报错,是因为CSFLE依赖的mongocryptd进程未正常启动,可以检查AutoEncryptionOptions中mongocryptd的相关配置,确保驱动可以正常启动或连接到mongocryptd进程即可解决。
内容的提问来源于stack exchange,提问作者Brijen Patel
相关产品推荐
相关产品推荐

