我在Java中使用MongoDB。我需要一种方法来检查MongoDB是否正在运行(以防止以后的例外)。我用以下代码尝试过:
mongoClient = new MongoClient();
try {
mongoClient.getAddress();
mongoRunning = true;
} catch (Throwable e){
log.warn("no db connected");
return;
}
我知道throwable不好,但是无论异常还是Throwable都不起作用。我看到了(没有输入catch块!):
[INFO ] 2018-11-10 22:33:26.209 [cluster-ClusterId{value='5be74e9f7170312fd4eb1ffe', description='null'}-127.0.0.1:27017] cluster - Exception in monitor thread while connecting to server 127.0.0.1:27017
com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:67) ~[mongo-java-driver-3.8.2.jar:?]
at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:126) ~[mongo-java-driver-3.8.2.jar:?]
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117) [mongo-java-driver-3.8.2.jar:?]
at java.lang.Thread.run(Thread.java:745) [?:1.8.0_102]
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[?:1.8.0_102]
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) ~[?:1.8.0_102]
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[?:1.8.0_102]
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[?:1.8.0_102]
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[?:1.8.0_102]
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[?:1.8.0_102]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[?:1.8.0_102]
at java.net.Socket.connect(Socket.java:589) ~[?:1.8.0_102]
at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:64) ~[mongo-java-driver-3.8.2.jar:?]
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:62) ~[mongo-java-driver-3.8.2.jar:?]
... 3 more
我的程序终止。我以为我知道Java :-(.。但是我也尝试过:
mongoClient.listDatabases();
这也很奇怪:mongoRunning设置为true,并且异步引发异常。 我需要一种方法来检查连接一次。是否可以没有任何例外并且以同步的方式?
答案 0 :(得分:1)
MongoClient
代表一个连接池。它管理连接以及线程中发生的一切。
我认为问“ MongoDB是否正在运行”是错误的。假设您有一个工具或工具来检查它是否正在运行,并且在检查时没有收到异常,但是在您检查MongoDB崩溃之后,您会怎么做。即尝试进行这种检查是错误的,而是应该集中精力以可靠的方式编写应用程序,并在查询时适当地进行错误处理。
此外,您可能会查看ConnectionPoolSettings
,其中有getMaxWaitQueueSize
,默认情况下有500个查询,然后才开始抛出异常。如果那是导致您遇到问题的原因,则可以尝试将其降低到较小的值,以便尽早开始接收异常。