首页 > 解决方案 > 如果使用不同的方法连接,为什么 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 (第二种情况)。

谢谢!

标签: javamongodb

解决方案


当使用 connectionString 连接到 mongodb 时,尝试使用参数connectTimeoutMS=10000 而不是serverSelectionTimeoutMS=10000,我还会添加一个套接字 timeout: socketTimeoutMS=10000,所以你的完整连接 uri 将是:

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

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


推荐阅读