尝试使用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)
当程序以不使用+srv
的MongoDB 3.6或更高版本的代码段开头时:
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,我有admin-user。另外,我可以通过Compass连接到我的集群和shell。 mongod
进程已启动。当我在IDE中运行时,此错误仅出现。同样的问题可能是here。
有谁知道如何解决此错误?我感谢任何帮助。
答案 0 :(得分:2)
另一个重要说明: 在此字符串中:
MongoClientURI uri = new MongoClientURI("mongodb+srv://admin:mypassword@cluster0-ox90k.mongodb.net/test?retryWrites=true");
test ==>是一个Db名称,在建立此连接之前,DB应该存在。
答案 1 :(得分:2)
上述解决方案在当前作业中不起作用,因为我正在处理Spring-boot框架作业。
我有错误,因为由以下原因引起:java.net.UnknownHostException:khwesacluster0.brzta.mongodb.net
要解决这个问题,我必须从下面进行配置
采用突出显示的网址 并将以下格式的 URL 设为
<块引用>spring.data.mongodb.uri=mongodb://:@
& application.properties 中的相同更新 如下,
spring.data.mongodb.uri=mongodb://username:password@khwesacluster0-shard-00-00.brzta.mongodb.net:27017,khwesacluster0-shard-00-01.brzta.mongodb.net:27017 ,khwesacluster0-shard-00-02.brzta.mongodb.net:27017/myFirstDatabase?ssl=true&replicaSet=atlas-3b1nqz-shard-0&authSource=admin&retryWrites=true&w=majority
答案 2 :(得分:1)
这里似乎有一些问题
第一
3.6.0不是实际上已加载到应用程序类路径中的Mongo驱动程序库;我怀疑您以前使用的是旧版本,而最近才更新了POM?您以前使用的是3.2.0版。
我怎么知道这个?
我开始仔细研究代码,at version 3.6.0,您提供的错误消息不在203行附近。而且,您还可以看到上面的链接代码支持+srv
。 / p>
回顾以前的发行版,我终于发现错误在第203行聚集,回到release 3.2.0。
长话短说,尝试进行Maven清理并重建。
如果项目刷新无济于事,请重新启动Eclipse以获取新的依赖项。
第二
MongoTimeoutException:等待服务器30000毫秒后超时
这很可能是防火墙/访问控制组配置问题,因为防火墙阻止了数据包到达您的Atlas群集。
答案 3 :(得分:1)
解决了! 所以,我所做的:
1)我只尝试通过 driver3.6 连接到层集群,并写了
mongodb+srv://user:<PASSWORD>@cluster0-ox90k.mongodb.net/test?retryWrites=true
我总是收到错误消息:Connection strings must start with 'mongodb://'
。
2)好吧,我删除了代码段+srv
并以相同的方式编写
mongodb://user:<PASSWORD>@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
最后解决了。
更新:如果您想使用驱动程序3.6+
,则需要编写而不是格式连接(并避免出现上述问题)
MongoClientURI uri = new MongoClientURI("mongodb+srv://admin:mypassword@cluster0-ox90k.mongodb.net/test?retryWrites=true");
MongoClient mongoClient = new MongoClient(uri);
此变体(感谢Kevin Adistambha):
MongoClient mongoClient = MongoClients.create("mongodb+srv://admin:mypassword@cluster0-ox90k.mongodb.net/test?retryWrites=true");
注意:密码需要写成不像mongodb://user:<mypassword>@...
,
仅采用mongodb://user:mypassword@...
格式
不带括号<>
。
答案 4 :(得分:0)
当尝试从我的tomcat应用程序连接到MongoDB时,我遇到了同样的问题。 我已经使用Mongo Driver 3.12.3安装了tomcat 9.0和MongoDB 4.2以及应用程序。
Error: org.springframework.dao.DataAccessResourceFailureException: Timed out after
30000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN,
servers=[{address=@127.0.0.1:27017, type=UNKNOWN, state=CONNECTING, exception=
{com.mongodb.MongoSocketException: @127.0.0.1}, caused by
{java.net.UnknownHostException: @127.0.0.1}}]; nested exception is
com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting to connect.
Client view of cluster state is {type=UNKNOWN, servers=[{address=@127.0.0.1:27017,
type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketException:
@127.0.0.1}, caused by {java.net.UnknownHostException: @127.0.0.1}}]
我尝试创建示例Java应用程序来连接数据库,并且可以正常工作,但是无法从Web应用程序进行连接。
因此为数据库创建了用户,并分配了角色userAdmin,这对我有用。
Not working Conn String - mongodb://@127.0.0.1:27017/docs <br>
Working Conn string - mongodb://docs_local:docs@127.0.0.1:27017/docs