java - 如何通过 Java 驱动程序正确连接到 Atlas M0(免费层)集群?
问题描述
尝试使用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);
在这种情况下,错误是:
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);
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 中运行时才会出现此错误。同样的问题可能在这里。
有谁知道如何解决这个错误?我很感激任何帮助。
解决方案
解决了!所以,我做了什么:
我只尝试通过driver3.6连接到层集群并写了
mongodb+srv://user:@cluster0-ox90k.mongodb.net/test?retryWrites=true
我总是得到一个错误: Connection strings must start with 'mongodb://'
。
好的,我删除了片段
+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()
(从 3.7 版本开始),并且如此处所述:
MongoClient mongoClient = MongoClients.create("mongodb+srv://admin:mypassword@cluster0-ox90k.mongodb.net/test?retryWrites=true");
注意:密码需要写不一样mongodb://user:<mypassword>@...
,
只是格式mongodb://user:mypassword@...
没有大括号<>
。
推荐阅读
- c++ - 文件系统路径字符串方法返回混合的 \ 和 /
- javascript - window.location.href 没有刷新/重新加载页面
- sql - 需要以特定格式显示日期sql server
- xcode11 - 如何在 macOS Catalina 上触发屏幕录制权限系统模式对话框
- reactjs - ReactJS 编译失败:找不到模块“react”
- python - 有没有更快的方法将单词替换为词根(都在字典中)
- linux - 无法从 MeteorJs 应用程序连接到外部 MongoDB 数据库
- java - 生成绑定文件 Message Queue Broker 4.5
- ibm-doors - DOORS - 可追溯性专栏
- excel - vba过滤多个target.address