使用mongodb-driver-async连接MongoDB Atlas遇连接问题求助
解决mongodb-driver-async连接MongoDB Atlas的问题
核心问题分析
你遇到的连接问题主要源于驱动版本过旧、缺少SSL所需的Netty依赖以及使用了废弃的认证机制,以下是针对性的解决方案:
步骤1:升级驱动并添加必要依赖
你的mongodb-driver-async版本为3.0.4(2015年发布),严重落后于MongoDB Atlas的兼容要求,且缺少SSL连接必需的Netty依赖。更新为稳定的4.x版本并添加Netty:
<dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-async</artifactId> <version>4.10.2</version> <!-- 推荐使用最新稳定版 --> </dependency> <!-- 异步驱动SSL连接必须依赖Netty --> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.94.Final</version> </dependency>
步骤2:使用正确的连接代码
使用MongoDB Atlas提供的mongodb+srv连接字符串(自动解析集群节点,无需手动列出所有shard),并配置Netty流工厂:
// 替换<password>为你的管理员密码 ConnectionString connectionString = new ConnectionString( "mongodb+srv://admin:<password>@ac-bq9egvn.1v58qfz.mongodb.net/?retryWrites=true&w=majority" ); MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(connectionString) .streamFactoryFactory(NettyStreamFactoryFactory.builder().build()) // 指定Netty作为流实现 .build(); MongoClient mongoClient = MongoClients.create(settings); // 验证连接(异步方式) mongoClient.listDatabaseNames() .forEach( dbName -> System.out.println("已连接数据库: " + dbName), error -> System.err.println("连接失败: " + error.getMessage()), () -> System.out.println("连接成功!") );
针对你三次尝试的问题拆解
尝试1错误原因:
3.x版本的异步驱动默认使用NIO2流,但SSL连接仅支持Netty作为底层传输,缺少Netty依赖导致报错。添加Netty并指定NettyStreamFactoryFactory即可解决,但更推荐直接升级驱动。尝试2错误原因:
MONGODB-CR认证机制已被MongoDB Atlas废弃,当前默认使用SCRAM-SHA-1/SCRAM-SHA-256,无需手动指定authMechanism;同时连接字符串未启用SSL,Atlas强制要求SSL连接。尝试3错误原因:
驱动版本过旧,不支持Atlas的部分协议,且同样缺少Netty依赖,导致连接超时/失败。
内容的提问来源于stack exchange,提问作者sealabr
相关产品推荐
相关产品推荐

