gpt4 book ai didi

java - 如何通过Java驱动正确连接到Atlas M0 (Free Tier) 集群?

转载 作者:可可西里 更新时间:2023-11-01 09:38:38 38 4
gpt4 key购买 nike

尝试使用 MongoDB version 3.6 通过 Java 驱动程序连接 Atlas 集群.

所以,我这样写:

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

在这种情况下,错误是:

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)

当程序以使用 MongoDB 版本 3.6 或更高版本且没有 +srv 的片段开始时:

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

我收到一个错误: enter image description here

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)

在 POM 文件中我有依赖:

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

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

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

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

最佳答案

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

  1. 我只尝试通过driver3.6 连接到 tier cluster 并写了

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

我总是得到一个错误: Connection strings must start with 'mongodb://' .

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

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

再次得到错误:

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}}]

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

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

终于解决了。

注意:您可以通过将 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() 的另一个变体(as of the 3.7 release),如前所述here :

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

注意:密码不能写成mongodb://user:<mypassword>@...之类的,

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

没有大括号 <> .

关于java - 如何通过Java驱动正确连接到Atlas M0 (Free Tier) 集群?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50916467/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com