解决异常:com.mongodb.MongoSocketReadException: Prematurely reached end of stream

异常描述:

项目使用阿里云的mongo服务一段时间后出现:

原因

mongo没有配置空闲连接时间,而spring boot 默认的空闲连接时间为0。当连接闲置一段时间,由于防火墙或者负载均衡的原因,导致连接被关闭,而客户端并不知道,当客户端继续使用这个关闭的连接进行读写时就会出错。

解决

解决办法就是设置连接闲置时间,当超过这个闲置时间客户端主动关闭连接,下次使用时重新建立连接,这样可以有效避免连接失效的问题。

1.如果使用mongo 2.x的配置时,增加设置:

spring.data.mongodb.prepare.maxConnectionIdleTime=60000
spring.data.mongodb.prepare.maxConnectionLifeTime=0

2.写一个配置类设置空闲连接时间

@Configuration
public class MongoCongig {

    @Bean
    public MongoClientOptions mongoOptions() {
        return MongoClientOptions.builder().maxConnectionIdleTime(3000).build();

    }

3.如果使用mongo 3.x 配置:

spring.data.mongodb.uri=mongodb://username:[email protected]:3717/test?maxIdleTimeMS=3000

补充:

mongo 3.x 配置:

  • uri: mongodb://[username:password@]host1[:port1][,hostN[:portN]]][/[database[.collection]][?options]]
  • options属性

​​​​​​​

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章