如果使用其他方法连接,为什么Mongo不会引发异常?

时间:2018-11-26 22:42:55

标签: 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(第二种情况)。

谢谢!

1 个答案:

答案 0 :(得分:0)

在使用connectionString连接到mongodb时,请尝试使用参数connectTimeoutMS=10000 而不是serverSelectionTimeoutMS=10000,我还要添加一个套接字超时:socketTimeoutMS=10000,因此您的完整连接uri将是:

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

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