MONGODB01 - Prematurely reached end of stream 错误定位及修复
最近项目在运行过程,当一段时间没有操作mongo,再次访问报错,如下
 org.springframework.data.mongodb.UncategorizedMongoDbException: Prematurely reached end of stream; nested exception is com.mongodb.MongoSocketReadException: Prematurely reached end of stream
	at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:132)
	at org.springframework.data.mongodb.core.MongoTemplate.potentiallyConvertRuntimeException(MongoTemplate.java:2607)
	at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:2474)
	at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:2282)
	at org.springframework.data.mongodb.core.ExecutableFindOperationSupport$ExecutableFindSupport.doFind(ExecutableFindOperationSupport.java:213)
	at org.springframework.data.mongodb.core.ExecutableFindOperationSupport$ExecutableFindSupport.all(ExecutableFindOperationSupport.java:169)
	at org.springframework.data.mongodb.repository.query.AbstractMongoQuery.lambda$getExecution$1(AbstractMongoQuery.java:113)
	at org.springframework.data.mongodb.repository.query.AbstractMongoQuery.execute(AbstractMongoQuery.java:97)
	at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:602)
	at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:590)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
	at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
	at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:61)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
原因
mongo没有配置空闲连接时间,而spring boot 默认的空闲连接时间为0,即永不超时。当连接闲置一段时间,由于防火墙或者负载均衡的原因,导致连接被关闭,而客户端并不知道,当客户端继续使用这个关闭的连接进行读写时就会出错。
解决方式
方式一:写一个配置类设置空闲连接时间
@Configuration
public class MongoCongig {
    @Bean
    public MongoClientOptions mongoOptions() {
        //默认空置一个小时重置一次
        return MongoClientOptions.builder().maxConnectionIdleTime(3600000).build();
	}
}
方式二:如果使用mongo 3.x 配置
spring.data.mongodb.uri=mongodb://username:password@xx.mongodb.rds.aliyuncs.com:3717/test?maxIdleTimeMS=3600000
方式三:引入spring-boot-starter-mongodb-plus
POM文件
<dependency>
    <groupId>com.spring4all</groupId>
    <artifactId>mongodb-plus-spring-boot-starter</artifactId>
    <version>1.0.0.RELEASE</version>
</dependency>
配置
spring:
  data:
    mongodb:
      option:
        max-connection-idle-time: 3600000
在启动类加上@EnableMongoPlus注解
@EnableMongoPlus
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
PS:此包是对官方spring boot starter对mongodb支持的扩展,提供更多配置属性,比如:连接数的配置等,GITHUB地址
支持的配置属性如下:
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
以上均为默认配置
补充MongoDB连接Options(3.6.X)
mongo 3.6.x 配置:
- uri: mongodb://[username:password@]host1[:port1][,hostN[:portN]]][/[database[.collection]][?options]] 
- options属性 
常见配置整理如下:
| 属性 | 值 | 说明 | 
|---|---|---|
| authSource | 数据库名 | 开启认证的database | 
| authMechanism | SCRAM-SHA-1 MONGODB-CR (Deprecated in MongoDB 3.6) MONGODB-X509 GSSAPI (Kerberos) PLAIN (LDAP SASL) | 认证方式 | 
| ssl | true或false | 是否采用ssl | 
| connectTimeoutMS | 任务毫秒数 | 连接超时时间 | 
| maxIdleTimeMS | 毫秒数,默认0 | 最大空闲时间 | 
| maxLifeTimeMS | 毫秒数,默认0 | 最大存活时间 | 
| maxPoolSize | 数量,默认100 | 最大连接数 | 
| minPoolSize | 数量,默认0 | 最小连接数 | 
| waitQueueMultiple | 数量,默认5 | 每个连接的队列等待数量 | 
| waitQueueTimeoutMS | 毫秒数,默认以驱动为准 | 线程最长等待时间 | 
| slaveOk | true或false | 是否从slave读取数据 | 
| readPreference | primary (Default) primaryPreferred secondary secondaryPreferred nearest | 读取偏好,会覆盖slaveOK | 
官方options文档:传送门
MONGODB01 - Prematurely reached end of stream 错误定位及修复的更多相关文章
- 记一次spring boot中MongoDB Prematurely reached end of stream的异常解决
		在spring boot项目中使用了mongodb,当一段时间没有操作mongodb,下次操作mongodb时就会出现异常.异常如下: org.springframework.data.mongodb ... 
- Mongodb: com.mongodb.MongoSocketReadException: Prematurely reached end of stream
		saveLocationInfo errorcom.mongodb.MongoSocketReadException: Prematurely reached end of stream at com ... 
- asp上传图片提示 ADODB.Stream 错误 '800a0bbc'的解决方法
		asp上传图片提示 ADODB.Stream 错误 '800a0bbc' 有这个提示有很多问题导致.权限是常见一种.这个不多说,还有一个有点怪的就是 windows2008显示系统时间的格式竟然是:2 ... 
- move_uploaded_file的failed to open stream错误处理
		PHP的基本语法学习的差不多了,现在开始学习PHP的文件上传功能实现了.功能中使用到了move_uploaded_file方法,运行时报错: failed to open stream. 经过查资料, ... 
- hive查询遇到java.io.EOFException: Unexpected end of input stream错误
		hive查询遇到java.io.EOFException: Unexpected end of input stream错误 原因基本上有两个: 空文件 不完整的文件 解决办法: 删除对应文件- 参考 ... 
- 解决:ADODB.Stream 错误 '800a0bbc' 写入文件失败
		重装更改目录为e盘后,上传文件出现问题.解决方法: 调用adodb.stream的savetofile方法时发生错误, ADODB.Stream 错误 800a0bbc 写入文件失败.(msxml3. ... 
- ahjesus fstab修改错误了如何修复
		fstab修改错误了如何修复 当你不小心把磁盘表输入错误以后,系统总是让你按ctrl+D重新启动或者输入密 码进入shell,你输入密码登陆后, 编辑文件是只读的,执行下面的命令后就可以编辑了 ... 
- Java中死锁的定位与修复
		死锁应该可以说是并发编程中比较常见的一种情况,可以说如果程序产生了死锁那将会对程序带来致命的影响:所以排查定位.修复死锁至关重要: 我们都知道死锁是由于多个对象或多个线程之间相互需要对方锁持有的锁而又 ... 
- PGPool 配置错误定位 s_do_auth: expecting R got E
		自从按照教程 http://www.pgpool.net/docs/latest/pgpool-zh_cn.html#hba配置好PGPool以后,每次启动 pgpool -c -n -D 都报 s_ ... 
随机推荐
- 基础篇:深入JMM内存模型解析volatile、synchronized的内存语义
			目录 1 java内存模型,JMM(JAVA Memory Model) 2 CPU高速缓存.MESI协议 3 指令重排序和内存屏障指令 4 happen-before原则 5 synchronize ... 
- GZip 压缩解压 工具类 [ GZipUtil ]
			片段 1 片段 2 pom.xml <dependency> <groupId>commons-codec</groupId> <artifactId> ... 
- matlab中drawnow更新图窗并处理回调
			来源:https://ww2.mathworks.cn/help/matlab/ref/drawnow.html?searchHighlight=drawnow&s_tid=doc_srcht ... 
- 【题解】SP10570 【LONGCS - Longest Common Substring】
			\(\color{Red}{Link}\) \(\text{Solution:}\) 还是\(\text{Suffix Tree.}\) 根据\(\color{Blue}{Link}\)我们可以得到一 ... 
- 轻轻松松学CSS:Grid布局
			网页布局总的来说经历了以下四个阶段: 1.古老的table表格布局,现在基本已被淘汰. 2.float浮动布局(或者position定位布局),借助float.position 等属性等进行布局,这种 ... 
- java swing 按钮事件触发两次或者多次
			按钮事件触发多次? 如果是JButton,八成是由于粗心,多次添加了监听事件 保持只添加一个监听事件就解决了~ 
- git克隆指定分支到本地
			我们每次使用命令 git clone https://xxx.com/android-app.git 默认 clone 的是这个仓库的 master 分支. 使用Git下载指定分支命令为:git cl ... 
- 1.ffmpeg、ffplay、ffprobe命令使用
			1.学前知识 1.1视频码率值 码率公式: 码率(kbps)=文件大小(KB)*8/时间(秒) 所以码率和视频文件大小成正比的,不过码率超过一定值后,人眼是看不出效果的. 接下来,我们便先来学习ffm ... 
- github 如何解决error: failed to push some refs
			错误 error: failed to push some refs to 'https://github.com/whitclass/scrapy-spider.git' hint: Updates ... 
- docker启动服务---------------nginx+php
			环境 首先安装Docker,无论你是Windows还是Linux.MocOS都可以.安装Docker自行百度. Docker镜像源 访问https://hub.docker.com即可,它是镜像大仓库 ... 
