项目场景:
使用springboot连接mongodb数据库
问题描述
在开始的时候使用的是本地连接,yaml中配置如下:
spring:
data:
mongodb:
authentication-database: admin
host: 192.168.0.101
port: 27017
database: test
username: admin
password: '123456'
正常连接没有问题,但是迁移到阿里云发现报错:Prematurely reached end of stream
原因分析:
在网上搜索很多都是连接一段时间出现了该错误信息,主要的原因可能是连接超时于是进行配置
socketKeepAlive = true; socketTimeout = 30000;
发现没有解决问题
也有说连接闲置一段时间,由于防火墙或者负载均衡的原因,导致连接被关闭,而客户端并不知道,当客户端继续使用这个关闭的连接进行读写时就会出错。
解决办法就是设置连接闲置时间,当超过这个闲置时间客户端主动关闭连接,下次使用时重新建立连接,这样可以有效避免连接失效的问题。
在spring boot中配置MongoClientOptions的bean如下:
@Configuration
public class WechatMpConfiguration {
@Bean
public MongoClientOptions mongoOptions() {
//将最大闲置超时时间设置3000ms
return MongoClientOptions.builder().maxConnectionIdleTime(3000).build();
}
}
但是在做这些配置之前突然考虑一个问题,我这不是闲置,于是尝试连接客户端,发现同样报错,所以应该是连接时的错误
解决方案:
因为考虑到是使用的阿里云,而阿里云最喜欢的就是设置白名单,这时正好看到一篇文章说是也是多台服务器忘记追加白名单,所以也去试着加白名单
客户端连接测试ok,这时候启动spring测试正常
总结:
Prematurely reached end of stream 问题出现,就是未正常连接成功,所以先考虑白名单的问题,测试客户端时候正常连接,如果正常说明云端没有问题,这时在考虑配置问题,是否超时等