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

标签 java mongodb intellij-idea

尝试使用 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/

相关文章:

android - Android Gradle 项目(Intellij IDEA)中的依赖

java - 在没有主类的情况下创建 Jar 库

python - 在 mongodb 中存储对象值

mongodb - Mongoose 验证崩溃应用程序

node.js - 将集合文档插入到mongodb中的另一个集合中

java - 用于蓝牙通信的轻量级对称 key 算法?

intellij-idea - 格式化输出,以便 Intellij Idea 显示两个文本的差异

java - java oauth 2.0 插件编译失败的 Google+ 快速入门

java - 如何使用 ORMLite 实现对象缓存

java - mozilla rhino 从 javascript 覆盖一个对象方法