【问题标题】:com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[]com.mongodb.MongoTimeoutException:等待连接时超时 30000 毫秒。集群状态的客户端视图是 {type=UNKNOWN, servers=[]
【发布时间】:2020-10-16 17:55:39
【问题描述】:

我们正在尝试使用 Java 代码连接到 Mongo Atlas

URI "mongodb+srv::@serveraddress/dbname?retryWrites=true&w=1" 但得到 MongoTimeoutException 异常。

这里的奇怪之处在于异常跟踪服务器=[] 列表为空。

这个错误的可能原因是什么?

MongoDB 服务器和 Java 驱动程序详细信息:

MongoDB 服务器: 4.2

MongoDB java 驱动程序: 3.12.5

spring-data-mongodb: 2.1.5.RELEASE

如果需要任何进一步的信息,请告诉我。

感谢您的帮助。

com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[]
    at com.mongodb.internal.connection.BaseCluster.getDescription(BaseCluster.java:182)
    at com.mongodb.internal.connection.AbstractMultiServerCluster.getDescription(AbstractMultiServerCluster.java:54)
    at com.mongodb.client.internal.MongoClientDelegate.getConnectedClusterDescription(MongoClientDelegate.java:152)
    at com.mongodb.client.internal.MongoClientDelegate.createClientSession(MongoClientDelegate.java:103)
    at com.mongodb.Mongo.createClientSession(Mongo.java:832)
    at com.mongodb.MongoClient.startSession(MongoClient.java:582)
    at com.mongodb.MongoClient.startSession(MongoClient.java:569)
    at com.shutterfly.services.project.InitMongoDBCollection.onApplicationEvent(InitMongoDBCollection.java:36)
    at com.shutterfly.services.project.InitMongoDBCollection.onApplicationEvent(InitMongoDBCollection.java:20)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:402)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:359)
    at org.springframework.boot.context.event.EventPublishingRunListener.running(EventPublishingRunListener.java:105)
    at org.springframework.boot.SpringApplicationRunListeners.running(SpringApplicationRunListeners.java:78)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:332)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)
    at com.shutterfly.services.project.Application.main(Application.java:18)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:53)
    at java.lang.Thread.run(Thread.java:748)

【问题讨论】:

  • 现已解决,实际问题是实例连接到 Mongo Atlas 服务器的时间超过预期。并且实例在连接成功之前停止并且以连接超时问题结束。我保留这个问题,所以如果有人遇到这种问题,他们也应该从这个角度来看待它。

标签: mongodb spring-data-mongodb


【解决方案1】:

在我的情况下,mongo 根本没有运行 :)

请检查:

systemctl status mongod.service

并确保在重新启动服务器之前启用它:

systemctl enable mongod.service

【讨论】:

    【解决方案2】:

    添加答案以便对其他人有所帮助,他们将来可能会遇到类似问题。

    我们已经解决了这个问题,问题是查找集群列表并使用默认时间连接到该列表需要时间,我们可以使用“MongoClientOptionsFactoryBean”自定义参数并可以覆盖默认配置。

    @Bean
    public MongoClientOptionsFactoryBean getMongoClientOptionsFactoryBean() {
            MongoClientOptionsFactoryBean mongoClientOptionsFactoryBean = new MongoClientOptionsFactoryBean();
            mongoClientOptionsFactoryBean.setConnectTimeout(timeout);
            mongoClientOptionsFactoryBean.setConnectionsPerHost(connectionsPerHost);
            mongoClientOptionsFactoryBean.setMaxWaitTime(maxWaitTime);
            mongoClientOptionsFactoryBean.setServerSelectionTimeout(ServerSelectionTimeout);
            mongoClientOptionsFactoryBean.setThreadsAllowedToBlockForConnectionMultiplier(connMultiplier);
            return mongoClientOptionsFactoryBean;
        }
    

    【讨论】:

    • 您好,Deepak,我看到了同样的异常。启用了 istio 的服务(springboot 应用程序)正在尝试在同一集群的另一个 pod 中调用启用了 istio 的 mogodb。当启用 istio 的 App 容器出现时,它说与 Mongo 的连接已建立。但是当发送请求时,会看到异常。您的任何意见。
    • 有几点: 1. 你的数据库分片了吗? 2. 您是否使用了任何可能导致问题的 java 注释。我遇到了一个问题,我使用了@Indexed 注释,并且在删除它得到解决后,我开始遇到同样的异常。 3. 还要确保 MongoDB/mongos 服务正在运行。
    • 不,它没有分片。没有特定于 java 的注释和没有索引。
    • 不,它没有分片,没有特定于 java 的注释和没有索引。 Mongod 正在运行。在我的例子中,为 mongodb 容器启用了 Istio 服务网格(Envoy pxoxy)。在同一个集群中,当来自 istio 启用的 pod 的请求命中 isto 启用的 mongodb pod 时,就会出现该错误。以另一种方式如何为集群内 mongodb 配置服务网格?。
    • 谢谢。它们在同一个 N/W 中,并且 Mongodb(启用了 istioservice 网格)作为单独的容器运行。它在我在其服务定义中使用 appProtocol 和端口名称作为 mongo-mongodb 后工作。?
    【解决方案3】:

    所以我有同样的问题 我用这段代码修复它 使用这个导入

            import com.mongodb.client.MongoClient;
    

    这是代码

            String web="mongodb://";
            MongoClient mongoClient = MongoClients.create(web+ENVIRONMENT);
            database = mongoClient.getDatabase("PUT_HERE_YOUR_DB_NAME");
    

    可能在某些地方您需要更改网络

          String web="mongodb+srv://"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 2019-07-01
      • 2020-05-09
      • 2020-07-06
      • 1970-01-01
      • 2018-12-22
      • 1970-01-01
      相关资源
      最近更新 更多