MongoDB проверка соединения без исключения - PullRequest
0 голосов
/ 11 ноября 2018

Я использую MongoDB с Java. Мне нужен способ проверить, работает ли MongoDB (чтобы исключить исключения позже). Я попробовал это с этим кодом:

mongoClient = new MongoClient();
try {
    mongoClient.getAddress();
    mongoRunning = true;
} catch (Throwable e){
    log.warn("no db connected");
    return;
}

Я знаю, что throwable - это плохо, но он не работает ни с исключением, ни с Throwable. Я вижу (блок захвата не введен!):

[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 и исключение генерируется асинхронно. Мне нужен способ проверить соединение один раз. Возможно ли это без каких-либо исключений и синхронно способом?

1 Ответ

0 голосов
/ 11 ноября 2018

MongoClient представляет пул соединений. Он управляет связями, и все, что происходит в его потоках.

Я думаю, что неправильно задавать вопрос "работает ли MongoDB". Предположим, у вас есть инструмент или инструмент, чтобы проверить, работает ли он, и вы не получите никаких исключений во время проверки, но сразу после того, как вы провалили проверку MongoDB, что бы вы сделали. То есть неверно пытаться выполнить такую ​​проверку, вместо этого следует сосредоточиться на написании приложения надежным способом с надлежащей обработкой ошибок во время запросов.

Кроме того, вы можете посмотреть на ConnectionPoolSettings, который имеет getMaxWaitQueueSize, по умолчанию его 500 запросов, прежде чем он начнет выдавать исключения. Если это вызывает у вас проблемы, вы можете попытаться уменьшить это значение до меньшего, чтобы начать получать исключения раньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...