最近项目在运行过程,当一段时间没有操作mongo,再次访问报错,如下

  1. org.springframework.data.mongodb.UncategorizedMongoDbException: Prematurely reached end of stream; nested exception is com.mongodb.MongoSocketReadException: Prematurely reached end of stream
  2. at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:132)
  3. at org.springframework.data.mongodb.core.MongoTemplate.potentiallyConvertRuntimeException(MongoTemplate.java:2607)
  4. at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:2474)
  5. at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:2282)
  6. at org.springframework.data.mongodb.core.ExecutableFindOperationSupport$ExecutableFindSupport.doFind(ExecutableFindOperationSupport.java:213)
  7. at org.springframework.data.mongodb.core.ExecutableFindOperationSupport$ExecutableFindSupport.all(ExecutableFindOperationSupport.java:169)
  8. at org.springframework.data.mongodb.repository.query.AbstractMongoQuery.lambda$getExecution$1(AbstractMongoQuery.java:113)
  9. at org.springframework.data.mongodb.repository.query.AbstractMongoQuery.execute(AbstractMongoQuery.java:97)
  10. at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:602)
  11. at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:590)
  12. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
  13. at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59)
  14. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
  15. at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
  16. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
  17. at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:61)
  18. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)

原因

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

解决方式

方式一:写一个配置类设置空闲连接时间

  1. @Configuration
  2. public class MongoCongig {
  3. @Bean
  4. public MongoClientOptions mongoOptions() {
  5. //默认空置一个小时重置一次
  6. return MongoClientOptions.builder().maxConnectionIdleTime(3600000).build();
  7. }
  8. }

方式二:如果使用mongo 3.x 配置

  1. spring.data.mongodb.uri=mongodb://username:password@xx.mongodb.rds.aliyuncs.com:3717/test?maxIdleTimeMS=3600000

方式三:引入spring-boot-starter-mongodb-plus

POM文件

  1. <dependency>
  2. <groupId>com.spring4all</groupId>
  3. <artifactId>mongodb-plus-spring-boot-starter</artifactId>
  4. <version>1.0.0.RELEASE</version>
  5. </dependency>

配置

  1. spring:
  2. data:
  3. mongodb:
  4. option:
  5. max-connection-idle-time: 3600000

在启动类加上@EnableMongoPlus注解

  1. @EnableMongoPlus
  2. @SpringBootApplication
  3. public class Application {
  4. public static void main(String[] args) {
  5. SpringApplication.run(Application.class, args);
  6. }
  7. }

PS:此包是对官方spring boot starter对mongodb支持的扩展,提供更多配置属性,比如:连接数的配置等,GITHUB地址

支持的配置属性如下:

  1. spring.data.mongodb.option.min-connection-per-host=0
  2. spring.data.mongodb.option.max-connection-per-host=100
  3. spring.data.mongodb.option.threads-allowed-to-block-for-connection-multiplier=5
  4. spring.data.mongodb.option.server-selection-timeout=30000
  5. spring.data.mongodb.option.max-wait-time=120000
  6. spring.data.mongodb.option.max-connection-idle-time=0
  7. spring.data.mongodb.option.max-connection-life-time=0
  8. spring.data.mongodb.option.connect-timeout=10000
  9. spring.data.mongodb.option.socket-timeout=0
  10. spring.data.mongodb.option.socket-keep-alive=false
  11. spring.data.mongodb.option.ssl-enabled=false
  12. spring.data.mongodb.option.ssl-invalid-host-name-allowed=false
  13. spring.data.mongodb.option.always-use-m-beans=false
  14. spring.data.mongodb.option.heartbeat-socket-timeout=20000
  15. spring.data.mongodb.option.heartbeat-connect-timeout=20000
  16. spring.data.mongodb.option.min-heartbeat-frequency=500
  17. spring.data.mongodb.option.heartbeat-frequency=10000
  18. 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 错误定位及修复的更多相关文章

  1. 记一次spring boot中MongoDB Prematurely reached end of stream的异常解决

    在spring boot项目中使用了mongodb,当一段时间没有操作mongodb,下次操作mongodb时就会出现异常.异常如下: org.springframework.data.mongodb ...

  2. Mongodb: com.mongodb.MongoSocketReadException: Prematurely reached end of stream

    saveLocationInfo errorcom.mongodb.MongoSocketReadException: Prematurely reached end of stream at com ...

  3. asp上传图片提示 ADODB.Stream 错误 '800a0bbc'的解决方法

    asp上传图片提示 ADODB.Stream 错误 '800a0bbc' 有这个提示有很多问题导致.权限是常见一种.这个不多说,还有一个有点怪的就是 windows2008显示系统时间的格式竟然是:2 ...

  4. move_uploaded_file的failed to open stream错误处理

    PHP的基本语法学习的差不多了,现在开始学习PHP的文件上传功能实现了.功能中使用到了move_uploaded_file方法,运行时报错: failed to open stream. 经过查资料, ...

  5. hive查询遇到java.io.EOFException: Unexpected end of input stream错误

    hive查询遇到java.io.EOFException: Unexpected end of input stream错误 原因基本上有两个: 空文件 不完整的文件 解决办法: 删除对应文件- 参考 ...

  6. 解决:ADODB.Stream 错误 '800a0bbc' 写入文件失败

    重装更改目录为e盘后,上传文件出现问题.解决方法: 调用adodb.stream的savetofile方法时发生错误, ADODB.Stream 错误 800a0bbc 写入文件失败.(msxml3. ...

  7. ahjesus fstab修改错误了如何修复

    fstab修改错误了如何修复   当你不小心把磁盘表输入错误以后,系统总是让你按ctrl+D重新启动或者输入密 码进入shell,你输入密码登陆后,   编辑文件是只读的,执行下面的命令后就可以编辑了 ...

  8. Java中死锁的定位与修复

    死锁应该可以说是并发编程中比较常见的一种情况,可以说如果程序产生了死锁那将会对程序带来致命的影响:所以排查定位.修复死锁至关重要: 我们都知道死锁是由于多个对象或多个线程之间相互需要对方锁持有的锁而又 ...

  9. 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_ ...

随机推荐

  1. React代码开发规范

    前言 一般在团队开发中每个人的代码习惯都不太一样,这样就会导致代码风格不一致,以致于维护和修改bug的时候看别人的代码成为一种痛苦...这种情况尤其在前端开发中尤为明显.因为关于前端的开发规范貌似也没 ...

  2. layui动态添加选项卡

    <!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><head> <meta ...

  3. IP地址的获取

    //ip地址的获取:非原创,之前在其他地方看到,拿过来备份下: public static String getIPAddress(HttpServletRequest request) { Stri ...

  4. Android小部件Widget开发过程中的坑和总结

    @ 目录 概述 官方参考 效果图 AndroidManifest.xml Receiver Service Options res/xml/ widget_desktop_options.xml 常用 ...

  5. Paxos 协议

    可用性与一致性 为了向用户提供更好的服务体验,现代软件架构越来越注重系统的可用性availability. 正是在这种趋势的驱动下,微服务与容器化技术才能在今天大行其道. 而高可用架构的前提是冗余: ...

  6. GetDlgItem(函数详解)

    转载: https://blog.csdn.net/hk121/article/details/80942850 hwndScroll = GetDlgItem(hwnd, IDC_SCROLL); ...

  7. (转)DBC文件格式解析

    Dbc是描述CAN通信报文和信号信息的文件,用Vector Candb++打开. 用记事本打开后,可以看到固定格式,下面的博客做了详细的解析: https://blog.csdn.net/weixin ...

  8. kubernetes-介绍与特性

    1. kubernetes概述 1) kubernetes是什么 2) kubernetes能做什么 3) kubernetes特性 4) kubernetes集群架构与组件 5) kubernete ...

  9. chrome(谷歌)登录失败解决方案

    相信有很多小伙伴和我一样,同步chrome的收藏夹,这样也便于随时可以查看自己收藏的网址.但是同步文件,必须先要登录chrome账号,登录chrome账号时,总是会报黄页,或者一直加载不出来.接下来, ...

  10. centos8上配置openssh的安全

    一,openssh服务版本号的查看 1,查看当前sshd的版本号 : [root@yjweb ~]# sshd --help unknown option -- - OpenSSH_7.8p1, Op ...