mongo-java-driver(3.x)已停止维护,请迁移至 4.x 版本。驱动 | 推荐版本 | 兼容 MongoDB 版本 | 说明 |
mongodb-driver-sync | 4.9或以上 | 4.0 - 8.0 | 官方同步驱动,适用于传统阻塞式编程 |
mongodb-driver-reactivestreams | 4.9或以上 | 4.0 - 8.0 | 官方响应式驱动,适用于异步非阻塞场景 |
admin。MongoClient 实例应全局复用(单例模式),避免每次操作都创建新的连接。MongoClient。推荐使用 try-with-resources 语法自动关闭。MongoException 及其子类,并进行相应的重试或告警处理。<dependency><groupId>org.mongodb</groupId><artifactId>mongodb-driver-sync</artifactId><version>4.11.1</version></dependency>
implementation 'org.mongodb:mongodb-driver-sync:4.11.1'
package com.example.mongodb;import com.mongodb.ConnectionString;import com.mongodb.MongoClientSettings;import com.mongodb.client.*;import com.mongodb.client.model.Filters;import org.bson.Document;import java.util.concurrent.TimeUnit;public class MongoDBDemo {public static void main(String[] args) {// 连接 URI(请替换为您的实际连接信息)// 副本集连接串格式:// mongodb://mongouser:<password>@<IP1>:27017,<IP2>:27017,<IP3>:27017/admin?replicaSet=cmgo-xxxxxxxx_0String uri = "mongodb://mongouser:thepasswordA1@10.66.187.127:27017/admin";// 配置连接参数(包含连接池设置)MongoClientSettings settings = MongoClientSettings.builder().applyConnectionString(new ConnectionString(uri)).applyToConnectionPoolSettings(builder -> builder.maxSize(50) // 连接池上限.minSize(5) // 连接池下限.maxWaitTime(5, TimeUnit.SECONDS) // 等待可用连接的超时时间.maxConnectionIdleTime(60, TimeUnit.SECONDS)) // 空闲连接超时.applyToSocketSettings(builder -> builder.connectTimeout(10, TimeUnit.SECONDS) // 连接超时.readTimeout(30, TimeUnit.SECONDS)) // 读取超时.retryWrites(true) // 启用可重试写入.retryReads(true) // 启用可重试读取.build();// 创建客户端连接(使用 try-with-resources 自动关闭)try (MongoClient mongoClient = MongoClients.create(settings)) {// 选择数据库MongoDatabase database = mongoClient.getDatabase("mydb");// 获取集合MongoCollection<Document> collection = database.getCollection("users");// 插入文档Document doc = new Document("username", "jack").append("age", 31).append("email", "jack@example.com");collection.insertOne(doc);System.out.println("插入文档: " + doc.toJson());// 查询文档Document result = collection.find(Filters.eq("username", "jack")).first();if (result != null) {System.out.println("查询结果: " + result.toJson());}// 更新文档collection.updateOne(Filters.eq("username", "jack"),new Document("$set", new Document("age", 32)));System.out.println("更新完成");// 删除文档collection.deleteOne(Filters.eq("username", "jack"));System.out.println("删除完成");} catch (Exception e) {System.err.println("数据库操作失败: " + e.getMessage());e.printStackTrace();}}}
插入文档: {"username": "jack", "age": 31, "email": "jack@example.com", "_id": {"$oid": "6789abcdef1234567890abcd"}}查询结果: {"_id": {"$oid": "6789abcdef1234567890abcd"}, "username": "jack", "age": 31, "email": "jack@example.com"}更新完成删除完成
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>
spring:data:mongodb:uri: mongodb://mongouser:thepasswordA1@10.66.187.127:27017/mydb?authSource=admin# 副本集连接串:# uri: mongodb://mongouser:thepasswordA1@IP1:27017,IP2:27017,IP3:27017/mydb?authSource=admin&replicaSet=cmgo-xxxxxxxx_0
authSource=admin 是必须的配置项,云数据库 MongoDB 统一使用 admin 库作为认证数据库。URI 中 /mydb 为业务数据库名称,与认证库 admin 是不同的概念。import org.springframework.data.annotation.Id;import org.springframework.data.mongodb.core.mapping.Document;@Document(collection = "users")public class User {@Idprivate String id;private String username;private Integer age;private String email;// 构造函数、getter 和 setter 省略}
import org.springframework.data.mongodb.repository.MongoRepository;public interface UserRepository extends MongoRepository<User, String> {User findByUsername(String username);}
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.CommandLineRunner;import org.springframework.stereotype.Component;@Componentpublic class MongoDBRunner implements CommandLineRunner {@Autowiredprivate UserRepository userRepository;@Overridepublic void run(String... args) {// 插入文档User user = new User();user.setUsername("jack");user.setAge(31);user.setEmail("jack@example.com");userRepository.save(user);// 查询文档User found = userRepository.findByUsername("jack");System.out.println("查询结果: " + found);}}
com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='mongouser', source='admin', ...}Caused by: com.mongodb.MongoCommandException: Command failed with error 18 (AuthenticationFailed)
admin:云数据库 MongoDB 的所有用户统一使用 admin 作为认证库。请确认 URI 格式正确:// 正确:URI 路径指向 adminString uri1 = "mongodb://mongouser:thepasswordA1@10.66.187.127:27017/admin";// 正确:连接业务库时通过 authSource 指定认证库String uri2 = "mongodb://mongouser:thepasswordA1@10.66.187.127:27017/mydb?authSource=admin";// 错误:连接业务库时未指定 authSource,驱动将默认以 mydb 库认证,导致认证失败String uri3 = "mongodb://mongouser:thepasswordA1@10.66.187.127:27017/mydb";
@、: 等特殊字符,需在 URI 中进行编码:import java.net.URLEncoder;import java.nio.charset.StandardCharsets;String password = URLEncoder.encode("pass@123", StandardCharsets.UTF_8);String uri = String.format("mongodb://mongouser:%s@10.66.187.127:27017/admin", password);
com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[...]
telnet <MongoDB实例IP> 27017
Connected 表示网络可达。Connection timed out 表示网络不通,请确认 CVM 与 MongoDB 实例在同一 VPC 内,并检查安全组规则。connectTimeoutMS 配置值合理。内网环境下,10秒(10000ms)足够:MongoClientSettings settings = MongoClientSettings.builder().applyConnectionString(new ConnectionString(uri)).applyToSocketSettings(builder -> builder.connectTimeout(10, TimeUnit.SECONDS)).build();
replicaSet 参数值与控制台实例详情页显示的副本集名称一致:mongodb://mongouser:thepasswordA1@IP1:27017,IP2:27017/admin?replicaSet=cmgo-xxxxxxxx_0
cmgo-xxxxxxxx_0 格式,可在控制台实例详情页获取。com.mongodb.MongoSocketReadException: Prematurely reached end of stream
MongoClientSettings settings = MongoClientSettings.builder().applyConnectionString(new ConnectionString(uri)).applyToConnectionPoolSettings(builder -> builder.maxConnectionIdleTime(60, TimeUnit.SECONDS)) // 空闲连接 60 秒后自动关闭.build();
maxConnectionIdleTime 设置为60秒,避免长时间空闲的连接被服务端断开后仍被客户端复用。同时确保已开启 retryWrites(true) 和 retryReads(true),驱动会自动重试因连接断开而失败的操作。文档反馈