如何通过 Java 驱动程序正确连接到 Atlas M0(免费层)集群?

inv*_*bl3 8 java intellij-idea mongodb

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

所以,我写的是:

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

在这种情况下,错误是:

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)
Run Code Online (Sandbox Code Playgroud)

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

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

我收到一个错误: 在此处输入图片说明

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)
Run Code Online (Sandbox Code Playgroud)

在 POM 文件中,我有依赖项:

        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongo-java-driver</artifactId>
            <version>3.6.0</version>
        </dependency>
Run Code Online (Sandbox Code Playgroud)

另外,当我开始时,mongo我的数据库被添加到这个地址mongodb://127.0.0.1:27017,但我不是为此添加了到集群的路径。也许我需要写具体集群的路径还是?

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

有谁知道如何解决这个错误?我很感激任何帮助。

inv*_*bl3 6

解决了!所以,我所做的:

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

mongodb+srv://user:<PASSWORD>@cluster0-ox90k.mongodb.net/test?retryWrites=true
Run Code Online (Sandbox Code Playgroud)

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

2)好的,我删除了片段+srv并以相同的方式编写

mongodb://user:<PASSWORD>@cluster0-ox90k.mongodb.net/test?retryWrites=true
Run Code Online (Sandbox Code Playgroud)

并再次得到错误:

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}}]
Run Code Online (Sandbox Code Playgroud)

所以,我写了通过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
Run Code Online (Sandbox Code Playgroud)

最后它解决了。


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

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

使用另一种变体MongoClients.create() (如3.7版本的),并提到在这里:

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

注意:密码需要写不一样mongodb://user:<mypassword>@...,

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

没有大括号<>。