如何通过 Java 驱动程序正确连接到 Atlas M0(免费层)集群? [英] How to connect to Atlas M0 (Free Tier) cluster correctly via Java driver?

查看:23
本文介绍了如何通过 Java 驱动程序正确连接到 Atlas M0(免费层)集群?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

尝试使用

com.mongodb.MongoTimeoutException:等待与 ReadPreferenceServerSelector{readPreference=primary} 匹配的服务器时,30000 毫秒后超时.客户端查看集群状态为{type=UNKNOWN, servers=[{address=cluster0.mongodb.net:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketException: cluster0.mongodb.net},导致来自 {java.net.UnknownHostException: cluster0.mongodb.net}}]在 com.mongodb.connection.BaseCluster.createTimeoutException(BaseCluster.java:369)在 com.mongodb.connection.BaseCluster.selectServer(BaseCluster.java:101)在 com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.<init>(ClusterBinding.java:75)在 com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.(ClusterBinding.java:71)在 com.mongodb.binding.ClusterBinding.getReadConnectionSource(ClusterBinding.java:63)在 com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:201)在 com.mongodb.operation.CountOperation.execute(CountOperation.java:206)在 com.mongodb.operation.CountOperation.execute(CountOperation.java:53)在 com.mongodb.Mongo.execute(Mongo.java:772)在 com.mongodb.Mongo$2.execute(Mongo.java:759)在 com.mongodb.MongoCollectionImpl.count(MongoCollectionImpl.java:185)在 com.mongodb.MongoCollectionImpl.count(MongoCollectionImpl.java:170)在 project.Bot.check(Bot.java:36)在 project.Bot.onUpdateReceived(Bot.java:103)在 java.util.ArrayList.forEach(ArrayList.java:1249)在 org.telegram.telegrambots.generics.LongPollingBot.onUpdatesReceived(LongPollingBot.java:27)在 org.telegram.telegrambots.updatesreceivers.DefaultBotSession$HandlerThread.run(DefaultBotSession.java:309)

在 POM 文件中我有依赖:

 <依赖><groupId>org.mongodb</groupId><artifactId>mongo-java-driver</artifactId><version>3.6.0</version></依赖>

另外,当我启动 mongo 时,我的数据库被添加到这个地址 mongodb://127.0.0.1:27017,但我没有添加到集群的路径为了这.也许我需要写具体集群的路径或者?

Ofc,我有管理员用户.此外,我可以通过 Compass 连接到我的集群和 shell.mongod 进程启动.此错误仅在我在 IDE 中运行时出现.同样的问题可能这里.

有谁知道如何解决这个错误?感谢您的帮助.

解决方案

解决了!所以,我做了什么:

  1. 我只尝试通过 driver3.6 连接到层集群并写入

    mongodb+srv://user:@cluster0-ox90k.mongodb.net/test?retryWrites=true

我总是收到一个错误: 连接字符串必须以 'mongodb://' 开头.

  1. 好的,我删除了片段+srv 并以同样的方式编写

    mongodb://user:@cluster0-ox90k.mongodb.net/test?retryWrites=true

再次出现错误:

com.mongodb.MongoTimeoutException:等待与 ReadPreferenceServerSelector{readPreference=primary} 匹配的服务器时,30000 毫秒后超时.集群状态的客户端视图为 {type=UNKNOWN, servers=[{address=cluster0-ox90k.mongodb.net:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketException: cluster0-ox90k.mongodb.net},由 {java.net.UnknownHostException: cluster0-ox90k.mongodb.net}} 引起]

所以,我是通过driver3.4或更早版本写的

mongodb://user:@cluster0-shard-00-00-ox90k.mongodb.net:27017,cluster0-shard-00-01-ox90k.mongodb.net:27017,cluster0-shard-00-02-ox90k.mongodb.net:27017/test?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin&retryWrites=true

终于解决了.

注意:您可以通过将 Java 驱动程序设置为3.4 或更高版本"来从 Atlas 管理控制台获取此连接字符串.这将帮助您避免自己想出连接字符串.


更新:如果你想使用驱动3.7+,你需要编写而不是格式连接(并避免我上面的问题)

MongoClientURI uri = new MongoClientURI("mongodb+srv://admin:mypassword@cluster0-ox90k.mongodb.net/test?retryWrites=true");MongoClient mongoClient = new MongoClient(uri);

另一个使用 MongoClients.create() 的变体 (从 3.7 版本开始), 和如前所述 这里:

 MongoClient mongoClient = MongoClients.create("mongodb+srv://admin:mypassword@cluster0-ox90k.mongodb.net/test?retryWrites=true");

注意:密码不能像mongodb://user:<mypassword>@...,

只是格式 mongodb://user:mypassword@...

没有大括号<>.

Trying to connect Atlas cluster via Java driver using MongoDB version 3.6.

So, I'm writting like:

 MongoClientURI uri = new MongoClientURI("mongodb+srv://admin:mypassword@cluster0-ox90k.mongodb.net/test?retryWrites=true");
 MongoClient mongoClient = new MongoClient(uri);

In this case the error is:

java.lang.IllegalArgumentException: The connection string is invalid. Connection strings must start with 'mongodb://'
    at com.mongodb.ConnectionString.<init>(ConnectionString.java:203)
    at com.mongodb.MongoClientURI.<init>(MongoClientURI.java:176)
    at com.mongodb.MongoClientURI.<init>(MongoClientURI.java:158)
    at project.Bot.check(Bot.java:30)
    at project.Bot.onUpdateReceived(Bot.java:104)
    at java.util.ArrayList.forEach(ArrayList.java:1249)
    at org.telegram.telegrambots.generics.LongPollingBot.onUpdatesReceived(LongPollingBot.java:27)
    at org.telegram.telegrambots.updatesreceivers.DefaultBotSession$HandlerThread.run(DefaultBotSession.java:309)

When the program starts with snippet using MongoDB version 3.6 or later without +srv:

MongoClientURI uri = new MongoClientURI("mongodb://admin1:mypassword@cluster0-ox90k.mongodb.net/test?retryWrites=true");
MongoClient mongoClient = new MongoClient(uri);

I'm getting an error:

com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}. Client view of cluster state is {type=UNKNOWN, servers=[{address=cluster0.mongodb.net:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketException: cluster0.mongodb.net}, caused by {java.net.UnknownHostException: cluster0.mongodb.net}}]
    at com.mongodb.connection.BaseCluster.createTimeoutException(BaseCluster.java:369)
    at com.mongodb.connection.BaseCluster.selectServer(BaseCluster.java:101)
    at com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.<init>(ClusterBinding.java:75)
    at com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.<init>(ClusterBinding.java:71)
    at com.mongodb.binding.ClusterBinding.getReadConnectionSource(ClusterBinding.java:63)
    at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:201)
    at com.mongodb.operation.CountOperation.execute(CountOperation.java:206)
    at com.mongodb.operation.CountOperation.execute(CountOperation.java:53)
    at com.mongodb.Mongo.execute(Mongo.java:772)
    at com.mongodb.Mongo$2.execute(Mongo.java:759)
    at com.mongodb.MongoCollectionImpl.count(MongoCollectionImpl.java:185)
    at com.mongodb.MongoCollectionImpl.count(MongoCollectionImpl.java:170)
    at project.Bot.check(Bot.java:36)
    at project.Bot.onUpdateReceived(Bot.java:103)
    at java.util.ArrayList.forEach(ArrayList.java:1249)
    at org.telegram.telegrambots.generics.LongPollingBot.onUpdatesReceived(LongPollingBot.java:27)
    at org.telegram.telegrambots.updatesreceivers.DefaultBotSession$HandlerThread.run(DefaultBotSession.java:309)

In POM file I have dependency:

        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongo-java-driver</artifactId>
            <version>3.6.0</version>
        </dependency>

Also, when I'm starting mongo my database is added to this address mongodb://127.0.0.1:27017, but I added path to the cluster not for this. Maybe I need to write path to concrete cluster or?

Ofc, I have admin-user. In addition, I can connect via Compass to my cluster and from shell. mongod process is started. This error appears only, when I'm running in IDE. Same issue probably here.

Does anyone know how to solve this error? I appreciate any help.

解决方案

Solved it! So, what I've done:

  1. I tried only to connect to tier cluster via driver3.6 and wrote

    mongodb+srv://user:@cluster0-ox90k.mongodb.net/test?retryWrites=true

I always get an error: Connection strings must start with 'mongodb://'.

  1. Okay, I deleted the snippet +srv and wrote the same way

    mongodb://user:@cluster0-ox90k.mongodb.net/test?retryWrites=true

and get again the error:

com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}. Client view of cluster state is {type=UNKNOWN, servers=[{address=cluster0-ox90k.mongodb.net:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketException: cluster0-ox90k.mongodb.net}, caused by {java.net.UnknownHostException: cluster0-ox90k.mongodb.net}}]

So, I wrote via driver3.4 or earlier like

mongodb://user:<PASSWORD>@cluster0-shard-00-00-ox90k.mongodb.net:27017,cluster0-shard-00-01-ox90k.mongodb.net:27017,cluster0-shard-00-02-ox90k.mongodb.net:27017/test?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin&retryWrites=true

and finally it solved.

Note: You can get this connection string from the Atlas management console by setting your Java driver to '3.4 or later'. This will help you avoid having to come up with the connection string yourself.


Updated: if you want to use drivers 3.7+, you need to write instead of format connection (and to avoid my issues above)

MongoClientURI uri = new MongoClientURI("mongodb+srv://admin:mypassword@cluster0-ox90k.mongodb.net/test?retryWrites=true");
MongoClient mongoClient = new MongoClient(uri);

another variant using MongoClients.create() (as of the 3.7 release), and as mentioned here:

   MongoClient mongoClient = MongoClients.create("mongodb+srv://admin:mypassword@cluster0-ox90k.mongodb.net/test?retryWrites=true");

Note: the password need to write not like mongodb://user:<mypassword>@...,

just in format mongodb://user:mypassword@...

without braces <>.

这篇关于如何通过 Java 驱动程序正确连接到 Atlas M0(免费层)集群?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆