例外を解決します:com.mongodb.MongoSocketReadException:ストリームの終わりに時期尚早に到達しました



Resolve Exception



例外の説明:

プロジェクトがAlibabaCloudの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:root@xxxxx:3717/test?maxIdleTimeMS=3000

補足:

mongo 3.x構成:

  • 嫌い: mongodb:// [username:root @ xxxxx] host1 [:port1] [、hostN [:portN]]] [/ [database [.collection]] [?options]]
  • オプションプロパティ