java - 如果使用不同的方法连接,为什么 Mongo 不会抛出异常?
问题描述
我有一个问题,我需要 Mongo 在超时时抛出异常。问题是使用这种方式创建我的 MongoClient 它不会引发异常:
String database = "database";
String username = "myUser;
String connectionStringValue = "mongodb://" + username + ":" + repository.getPassword() + "@"
+ "myHost" + ":" + "27027" + "/" + database
+ "?serverSelectionTimeoutMS=10000";
ConnectionString connectionString = new ConnectionString(connectionStringValue);
MongoClient client = MongoClients.create(connectionString);
一切正常。我可以连接数据库,添加文档等。但是在出现超时情况时它不会抛出异常。相反,它返回一个空文档。
但是如果我使用这种方式连接:
MongoCredential credential = createCredentials(information);
ServerAddress serverAdress = new ServerAddress("myHost",
27027);
MongoClientOptions options = MongoClientOptions.builder().serverSelectionTimeout(10000).build();
return new MongoClient(serverAdress, credential, options);
再说一次,一切正常,但在这里我得到了预期的超时,而不是一个空文档作为响应。我想知道我在这里遗漏了什么,以使其在第一个案例超时后抛出异常。我需要使用第一种情况,因为我使用的是 com.mongodb.client.MongoClient 而不是 com.mongodb.MongoClient (第二种情况)。
谢谢!
解决方案
当使用 connectionString 连接到 mongodb 时,尝试使用参数connectTimeoutMS=10000
而不是serverSelectionTimeoutMS=10000
,我还会添加一个套接字 timeout: socketTimeoutMS=10000
,所以你的完整连接 uri 将是:
String connectionStringValue = "mongodb://" + username + ":" + repository.getPassword() + "@"
+ "myHost" + ":" + "27027" + "/" + database
+ "?connectTimeoutMS=10000"
+ "&socketTimeoutMS=10000;
这是根据 mongodb 手册,希望对您有所帮助。
推荐阅读
- generics - 计算散列(digest::Digest trait)并取回字符串的通用函数
- python - 是否可以附加到函数内部的外部列表形式?
- apache-flink - Flink 检查点不断失败
- javascript - 自定义反应数据表组件中的水平和垂直滚动问题
- vim - 如何删除 Vim 中某个字符之前的所有内容?
- typescript - 在 Angular 中评估枚举
- asp.net-core - .Net Core Swagger 不适用于必需的枚举?
- android - 在 Mac 上使用 Android Studio 在命令行中构建 Android 应用
- android - 尝试在空对象引用上调用虚拟方法 在空对象引用上调用虚拟方法
- ruby-on-rails - Rails 6 ActiveStorage 中的直接上传问题