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

时间:2018-06-18 19:43:19

标签: 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)

当程序以不使用+srv的MongoDB 3.6或更高版本的代码段开头时:

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,我有admin-user。另外,我可以通过Compass连接到我的集群和shell。 mongod进程已启动。当我在IDE中运行时,此错误仅出现。同样的问题可能是here

有谁知道如何解决此错误?我感谢任何帮助。

5 个答案:

答案 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

要解决这个问题,我必须从下面进行配置

enter image description here

采用突出显示的网址 并将以下格式的 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群集。

请参见adding addresses to the whitelist

答案 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