У меня есть бесплатная учетная запись Mongo Atlas, которая содержит базу данных с одной коллекцией. Клиент только читает коллекции и извлекает строки, поэтому я создал учетную запись с доступом только для чтения. Эта учетная запись протестирована через графический интерфейс компаса и работает нормально.
Однако я сталкиваюсь с проблемами, когда пытаюсь подключиться через mongo java API.
Первый код:
MongoClient mongoClient = MongoClients.create(this.mongoURI);
MongoDatabase database = mongoClient.getDatabase(this.database);
MongoCollection<Document> collection = database.getCollection(this.collectionName);
Приведенный выше фрагмент кода работал нормально, пока я работал на своем локальном хосте (докеризированном mongodb).
Mongo Atlas предложил использовать следующий код для подключения:
mongodb+srv://dev2:<password>@cluster0-ldxfb.mongodb.net/test?retryWrites=true
(Для справки, пожалуйста, найдите журналы первого кода в конце вопроса.)
Мне никогда не удавалось правильно работать с этой строкой в качестве значения this.mongoURI. Сервер никогда не отвечал данными, каждый вызов вызывал исключение.
После нескольких часов борьбы с этой проблемой я смог вернуть некоторые данные, используя этот подход:
Второй код:
MongoCredential credential = MongoCredential.createScramSha1Credential("dev2", "admin", "apass".toCharArray());
MongoClientSettings settings = MongoClientSettings.builder()
.credential(credential)
.retryWrites(false)
.applyToConnectionPoolSettings(builder ->
builder.maxConnectionIdleTime(60000, TimeUnit.MILLISECONDS))
.applyToSslSettings(builder -> builder.enabled(true))
.applyToClusterSettings(builder -> {
builder.hosts(Arrays.asList(
new ServerAddress("cluster0-shard-00-00-ldxfb.mongodb.net", 27017),
new ServerAddress("cluster0-shard-00-01-ldxfb.mongodb.net", 27017),
new ServerAddress("cluster0-shard-00-02-ldxfb.mongodb.net", 27017)
));
builder.requiredReplicaSetName("Cluster0-shard-0");
})
.build();
MongoClient mongoClient = MongoClients.create(settings);
MongoDatabase database = mongoClient.getDatabase(this.database);
MongoCollection<Document> collection = database.getCollection(this.collectionName);
Используя этот код, я могу получить данные, даже если время отклика составляет> 2 секунд.
Интересно, сталкивался ли кто-то еще с этой проблемой и сумел ли подключиться и получить данные с меньшим количеством кода.
Почему первый код не работает? Я знаю, что есть обходные пути, однако я хочу понять, почему код, который предлагает монго, не удался. ЖУРНАЛЫ
2019.04.02 10:17:01 INFO org.mongodb.driver.cluster Thread[nioEventLoopGroup-3-2,10,main]: Cluster created with settings {hosts=[127.0.0.1:27017], srvHost=cluster0-ldxfb.mongodb.net, mode=MULTIPLE, requiredClusterType=REPLICA_SET, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500, requiredReplicaSetName='Cluster0-shard-0'}
2019.04.02 10:17:01 WARNING io.helidon.webserver.RequestRouting Thread[nioEventLoopGroup-3-2,10,main]: Default error handler: Unhandled exception encountered.
java.util.concurrent.ExecutionException: Unhandled 'cause' of this exception encountered.
at io.helidon.webserver.RequestRouting$RoutedRequest.defaultHandler(RequestRouting.java:408)
REMOVE SOME LINES
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:644)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:579)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:496)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:458)
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:897)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.NullPointerException
at com.mongodb.internal.connection.BaseCluster.getDescription(BaseCluster.java:176)
at com.mongodb.internal.connection.AbstractMultiServerCluster.getDescription(AbstractMultiServerCluster.java:53)
at com.mongodb.client.internal.MongoClientDelegate.getConnectedClusterDescription(MongoClientDelegate.java:136)
at com.mongodb.client.internal.MongoClientDelegate.createClientSession(MongoClientDelegate.java:94)
at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.getClientSession(MongoClientDelegate.java:249)
at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:172)
at com.mongodb.client.internal.MongoCollectionImpl.executeCount(MongoCollectionImpl.java:249)
at com.mongodb.client.internal.MongoCollectionImpl.countDocuments(MongoCollectionImpl.java:218)
at com.mongodb.client.internal.MongoCollectionImpl.countDocuments(MongoCollectionImpl.java:213)
at io.lef.guides.se.rawina.Names.getMongoNameLastOrMiddle(Names.java:165)
at io.lef.guides.se.rawina.Names.getNameLastOrMiddle(Names.java:221)
at io.helidon.webserver.RequestRouting$RoutedRequest.next(RequestRouting.java:352)
... 29 more