与mongo驱动程序连接时,Spring Boot Mongo超时

时间:2019-04-01 11:19:34

标签: java spring spring-boot

虽然我正在使用spring-boot-starter-data-mongodb。我总是有超时异常。日志详细信息如下:

有人能告诉我为什么我总是超时吗?非常感谢。

2019-04-01 19:08:50.255  INFO 8336 --- [168.0.101:27017] org.mongodb.driver.cluster               : Exception in monitor thread while connecting to server 192.168.0.101:27017

com.mongodb.MongoSocketReadTimeoutException: Timeout while receiving message
    at com.mongodb.connection.InternalStreamConnection.translateReadException(InternalStreamConnection.java:530)
    at com.mongodb.connection.InternalStreamConnection.receiveMessage(InternalStreamConnection.java:421)

2019-04-01 19:09:15.163 DEBUG 8336 --- [nio-8888-exec-1] o.s.b.w.s.f.OrderedRequestContextFilter  : Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@4ce3ddaf
2019-04-01 19:09:15.165 ERROR 8336 --- [nio-8888-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.DataAccessResourceFailureException: Timed out after 30000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[{address=192.168.0.101:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketReadTimeoutException: Timeout while receiving message}, caused by {java.net.SocketTimeoutException: Read timed out}}]; 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=192.168.0.101:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketReadTimeoutException: Timeout while receiving message}, caused by {java.net.SocketTimeoutException: Read timed out}}]] with root cause

com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[{address=192.168.0.101:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketReadTimeoutException: Timeout while receiving message}, caused by {java.net.SocketTimeoutException: Read timed out}}]
    at com.mongodb.connection.BaseCluster.getDescription(BaseCluster.java:167)
    at com.mongodb.Mongo.getConnectedClusterDescription(Mongo.java:885)
    at com.mongodb.Mongo.createClientSession(Mongo.java:877)
    at com.mongodb.Mongo$3.getClientSession(Mongo.java:866)

我的application.yml是,春季启动版本是2.0.8.RELEASE,以下是内容:

spring:
  data:
    mongodb:
      host: 192.168.0.101
      port: 27017
      username: test
      password: test
      database: test
server:
  port: 8888
management:
  health:
    mongo:
      enabled: false

2 个答案:

答案 0 :(得分:0)

这不是最终解决方案,但是您可以尝试更长的超时时间。

 # The time to wait to establish a connection before timing out, in seconds.
 # (default: 10)
  connect_timeout: 99

如果在更改超时后成功连接,您应该找出建立连接并尝试修复它花费这么长时间的原因。 如果即使在设置很长的超时后仍无法连接,您也应该检查代理并尝试ping mongodb所在的计算机。

答案 1 :(得分:0)

您可以尝试以下方法:

<dependency>
    <groupId>com.spring4all</groupId>
    <artifactId>mongodb-plus-spring-boot-starter</artifactId>
    <version>1.0.0.RELEASE</version>
</dependency>
@EnableMongoPlus
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

比你还有更多的配置属性可以玩:)

spring.data.mongodb.option.min-connection-per-host=0
spring.data.mongodb.option.max-connection-per-host=100
spring.data.mongodb.option.threads-allowed-to-block-for-connection-multiplier=5
spring.data.mongodb.option.server-selection-timeout=30000
spring.data.mongodb.option.max-wait-time=120000
spring.data.mongodb.option.max-connection-idle-time=0
spring.data.mongodb.option.max-connection-life-time=0
spring.data.mongodb.option.connect-timeout=10000
spring.data.mongodb.option.socket-timeout=0

spring.data.mongodb.option.socket-keep-alive=false
spring.data.mongodb.option.ssl-enabled=false
spring.data.mongodb.option.ssl-invalid-host-name-allowed=false
spring.data.mongodb.option.always-use-m-beans=false

spring.data.mongodb.option.heartbeat-socket-timeout=20000
spring.data.mongodb.option.heartbeat-connect-timeout=20000
spring.data.mongodb.option.min-heartbeat-frequency=500
spring.data.mongodb.option.heartbeat-frequency=10000
spring.data.mongodb.option.local-threshold=15

我还没有尝试过...但是也许值得一试。

或者在仓库中查看如何在不依赖项目的情况下做到这一点;)