java - 如果使用不同的方法连接,为什么 Mongo 不抛出异常?

标签 java mongodb

我有一个问题,我需要 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 ,我还会添加一个套接字超时:socketTimeoutMS=10000 ,所以你的完整连接 uri 将是:

String connectionStringValue = "mongodb://" + username + ":" + repository.getPassword() + "@"
            + "myHost" + ":" + "27027" + "/" + database
            + "?connectTimeoutMS=10000"
            + "&socketTimeoutMS=10000;

这是根据 mongodb 手册编写的,希望对您有所帮助。

关于java - 如果使用不同的方法连接,为什么 Mongo 不抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53490229/

相关文章:

java - 使用 Jackson 不断解析一堆字符串的最有效方法是什么?

java - SWT FileDialog 扩展

Java Soap 向 WSDL 发出请求

javascript - Mongoose 查询以提取每个对话的最新文档

java - 使用 Amdatu 创建 Mongodb OSGI Bundle 时 bundle 未解析

java - 限制 @RequestBody 的 JSON 属性

java - 我可以跳过实现 HttpEntity#getContent() 吗?

mongodb - 如何使用 Spark 的 Mongo-Hadoop 连接器删除文档(记录)

node.js - mongodb是否需要在每个操作上进行连接

mysql - mongoDB vs mySQL——为什么在某些方面比另一个更好