如何使用Java检查MongoDB连接是否已建立?

3
在我的应用程序中,MongoDB 3.2.4 运行在自定义端口上。我想实现这样的逻辑:尝试连接自定义端口的 MongoDB,如果失败则使用默认端口27018
为了实现这个目标,我使用以下代码:
String mongoClientURI = "mongodb://" + DB_SRV_USR + ":" + DB_SRV_PWD + "@" + DB_URL + ":" + DB_PORT_CUS + "/" + dbName;
MongoClientURI connectionString = new MongoClientURI(mongoClientURI);

// enable SSL connection
MongoClientOptions.builder().sslEnabled(true).build();

if (this.mongoClient == null) {
    this.mongoClient = new MongoClient(connectionString);
}

// create database if doesn't exist
MongoDatabase mdb = this.mongoClient.getDatabase(dbName);

try {
    this.mongoClient.getAddress();
} catch (com.mongodb.MongoSocketOpenException e) {
    System.out.println("Switch to default port");
    /*…use default port logic…*/
}

问题在于这个异常没有被捕获。虽然MongoDB抛出了以下异常:
``` com.mongodb.MongoSocketOpenException: Exception opening socket at com.mongodb.connection.SocketStream.open(SocketStream.java:63) at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:114) at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:128) at java.lang.Thread.run(Thread.java:745) Caused by: java.net.ConnectException: Connection refused: connect at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:589) at com.mongodb.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:50) at com.mongodb.connection.SocketStream.open(SocketStream.java:58) ... 3 more ```
我的`try-catch`表达式无法捕获此异常。
我尝试了多种方法,例如捕获:
- `Exception` - `RuntimeException` - `MongoSocketOpenException` - `MongoException` - `MongoCommandException`
但都不起作用。
我的问题:
1. 如何检查是否建立了MongoDB连接? 2. 如何捕获`MongoSocketOpenException`异常?

我同意Frankenapps的观点,那个句子并没有抛出异常。我认为当你实例化客户端时会抛出异常,请在那里捕获异常。 - RubioRic
1个回答

1
  1. I use this code to check connection:

    try {
        mongo.getAddress();
    } catch (Exception e) {
        System.out.println("Database unavailable!");
        mongo.close();
        return;
    }
    
  2. Not sure here my guess would be that this.mongoClient.getAddress(); does not throw that exception, but I don't really know

编辑:我通过以下方式进行了初始化:

Builder builder = MongoClientOptions.builder().connectTimeout(3000);  
MongoClient mongo = new MongoClient(new ServerAddress("192.168.0.1", 3000), builder.build());

mongo 对象是什么类型?在我的情况下,mongoClientMongoClient 类型的一种。 - Mike
看起来我们使用了相同的对象但不同的构造函数。我使用: String mongoClientURI = "mongodb://" + DB_SRV_USR + ":" + DB_SRV_PWD + "@" + DB_URL + ":" + DB_PORT_CUS + "/" + dbName; MongoClientURI connectionString = new MongoClientURI(mongoClientURI); // enable SSL connection MongoClientOptions.builder().sslEnabled(true).build(); - Mike
我刚刚尝试了你的方法,但异常也没有被捕获。 - Mike
有更好的方法吗? - raga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接