3

在我的應用程序中,MongoDB 3.2.4運行在自定義端口上,我想實現邏輯,我的應用程序將嘗試在自定義端口上達到MongoDB,如果失敗,它將使用默認端口27018如何檢查是否用Java建立了MongoDB連接?

爲了做到這一點我使用下面的代碼:

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…*/ 
} 

的問題是,這個異常沒有被捕獲。在 com.mongodb.connection.InternalStreamConnection異常開口插座在 com.mongodb.connection.SocketStream.open(SocketStream.java:63): 雖然MongoDB引發以下例外:

com.mongodb.MongoSocketOpenException 。開(InternalStreamConnection.java:114) 在 com.mongodb.connection.DefaultServerMonitor $ ServerMonitorRunnable.run(DefaultServerMonitor.java:128) 在java.lang.Thread.run(Thread.java:745)引起的: java.net.ConnectException:連接被拒絕:連接在 java.net.DualStackPlainSocketImpl.waitForConnect(Native Me的ThOD)在 java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) 在 java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 在 java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java: 206) 在 java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 在java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)在 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.connect on.SocketStream.open(SocketStream.java:58) ... 3個

try-catch表達不能趕上這個例外。

我嘗試多種方法,如抓:

  • Exception
  • RuntimeException
  • MongoSocketOpenException
  • MongoException
  • MongoCommandException

他們都不工作。

我的問題:

  1. 我如何檢查是否建立MongoDB連接?
  2. 怎麼能趕上例外MongoSocketOpenException
+0

我同意Frankenapps,那句話不是拋出異常。我認爲當你實例化你的客戶時,它正在被拋出。趕上那裏的例外。 – RubioRic

回答

0
  1. 我用這個代碼來檢查連接:

    try { 
        mongo.getAddress(); 
    } catch (Exception e) { 
        System.out.println("Database unavailable!"); 
        mongo.close(); 
        return; 
    } 
    
  2. 不知道我在這裏的猜測是,this.mongoClient.getAddress();沒有拋出異常,但我真的不知道

編輯:我初始化它通過:

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

什麼類型的'mongo'對象是?在我的例子中,'mongoClient'是一種'MongoClient'。 –

+0

它看起來像我們使用相同的對象,但不同的構造函數。我使用: 'String mongoClientURI =「mongodb://」+ DB_SRV_USR +「:」+ DB_SRV_PWD +「@」+ DB_URL +「:」+ DB_PORT_CUS +「/」+ dbName; MongoClientURI connectionString = new MongoClientURI(mongoClientURI); //啓用SSL連接 MongoClientOptions.builder()。sslEnabled(true).build();' –

+0

您是否嘗試過使用我的構造函數? – frankenapps