解決異常: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屬性

​​​​​​​

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