SpringBoot使用MongoDB异常问题
一 环境介绍
- SpringBoot1.5.13.RELEASE(本地)
- Spring Data MongoDB
- Java 8
- MongoDB(青云)
二 问题描述
- 使用Studio3T或者Compass等MongoDB的GUI工具连接MongoDB不操作一段时间,就会掉线。但重连速度很快。
- 使用Java的Mongo连接驱动,也是一段时间不操作,再去操作会出现异常(SocketTimeout,能发不能收;连接没有断),同样也是重连速度很快。
# java日志太长,省略一部分
14:03:47.629 [http-nio-8081-exec-5] ERROR c.d.o.c.TestController - Timeout while receiving message; nested exception is com.mongodb.MongoSocketReadTimeoutException: Timeout while receiving message
org.springframework.data.mongodb.UncategorizedMongoDbException: Timeout while receiving message; nested exception is com.mongodb.MongoSocketReadTimeoutException: Timeout while receiving message
......
Caused by: com.mongodb.MongoSocketReadTimeoutException: Timeout while receiving
message
......
Caused by: java.net.SocketTimeoutException: Read timed out
三 搜索原因
连接被对方丢弃
- MongoDB始终是部署操作系统上,而对于大型公司提供MongoDB的服务会经过层层防火墙、代理服务和负载均衡器。它们把Java保持的连接踢掉了(状态变成
CLOSE_WAIT
,只能发数据但无法再收到)。 - 于是提了工单问青云情况,他们反馈就是如果从外网连接需要通过VPN才不会掉线,经过测试将应用部署在青云服务器上的确没有问题。
- 如果是自己的服务器搭建mongdb可以参考:https://stackoverflow.com/questions/35597930/sockettimeout-with-opened-connection-in-mongodb 该链接解决。(设置:sudo sysctl -w net.ipv4.tcp_keepalive_time= )
参考:https://segmentfault.com/q/1010000009595664/a-1020000009596082
- 同样的情况也出现在了微软的Azure Load Balancer。
四 解决方案
(1)Studio 3T的掉线问题
- 设置 Max connection idle time(连接池中某个连接的空闲时间超过该值,将丢弃该连接并重新新建立一个连接)
参考:https://studio3t.com/knowledge-base/articles/prevent-mongodb-connection-timeout/
(2)SpringBoot中如何设置?
- 方案1:
@Configuration
public class MongoDbSettings {
@Bean
public MongoClientOptions mongoOptions() {
return MongoClientOptions
.builder()
.maxConnectionIdleTime(60000)
.build();
}
}
- 方案2:程序员DD的spring-boot-starter-mongodb-plus
参考:http://blog.didispace.com/springbootmongodb-plus/
(3)应用放到防火墙里面
五 Spring Data Mongo与mongodb-driver的关系
- SpringBoot启动日志中的一句(由SimpleServerCluster打印的)
14:36:55.672 [restartedMain] INFO org.mongodb.driver.cluster - Cluster created with settings {hosts=[mongodb的IP地址:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500}
# 这句日志只能显示简短的启动信息,不能作为你修改了配置后是否生效的判断依据。
- mongodb-driver相关的类
- MongoClientOptions:MongoDB连接的配置类
- MongoClient(继承Mongo):带有连接池的Mongo客户端
- Mongo:带有连接池的数据库连接
- DefaultClusterFactory:集群实现的默认工厂
- SimpleServerCluster:真正创建的集群Server连接
- DB:MongoDB集群中逻辑数据库的线程安全客户端视图,用于实际操作MongoDB的类。
- Spring Data Mongo相关的类
- MongoOperations:指定一组基本MongoDB操作的接口。(Spring Data Mongo)
- MongoTemplate(实现MongoOperations):MongoOperations的首要实现类(Spring Data Mongo)
- SimpleMongoDbFactory:一个从Mongo实例创建DB实例的工厂类。(Spring Data Mongo)
注意:篇幅有限,加上比较复杂,以后再详细研究一下。
SpringBoot使用MongoDB异常问题的更多相关文章
- springboot集成mongoDB 异常认证
1.springboot连接mongoDB 出现异常认证 异常详情: com.mongodb.MongoSecurityException: Exception authenticating Mong ...
- springboot操作mongodb
springboot操作mongodb 采用MongoRepository操作mongodb springboot版本2.1.2.RELEASE 注意的是:在运行应用程序时,会报错OSS Algori ...
- 实例讲解Springboot整合MongoDB进行CRUD操作的两种方式
1 简介 Springboot是最简单的使用Spring的方式,而MongoDB是最流行的NoSQL数据库.两者在分布式.微服务架构中使用率极高,本文将用实例介绍如何在Springboot中整合Mon ...
- SpringBoot 整合 MongoDB 实战介绍
一.介绍 在前面的文章中,我们详细的介绍了 MongoDB 的配置和使用,如果你对 MongoDB 还不是很了解,也没关系,在 MongoDB 中有三个比较重要的名词:数据库.集合.文档! 数据库(D ...
- java操作mongodb & springboot整合mongodb
简单的研究原生API操作MongoDB以及封装的工具类操作,最后也会研究整合spring之后作为dao层的完整的操作. 1.原生的API操作 pom.xml <!-- https://mvnre ...
- SpringBoot整合mongoDB
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 这一片文章介绍一个springboot整合mongodb,如果你了解整合mysql之类的 ...
- SpringBoot与mongodb的结合
本文系列文章: 使用Shell 操作 MongoDB的技巧 MongoTemplate的使用技巧及其注意事项 敬请期待. 前言 最近公司想要做一个用户行为数据的收集,最开始想用mysql来存储 ...
- SpringBoot操作MongoDB实现增删改查
本篇博客主讲如何使用SpringBoot操作MongoDB. SpringBoot操作MongoDB实现增删改查 (1)pom.xml引入依赖 <dependency> <group ...
- SpringBoot结合MongoDB入门
MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系 ...
随机推荐
- tocke - 加密
//获取32位随机字符串 $randTocke = getRandChar($length); //当前脚本运行时间, 单位为十万分之一毫秒 $timestamp = $_SERVER['REQUES ...
- MongoDB(mongodb-win32-x86_64-enterprise-windows-64-4.2.1-signed.msi)下载,启动和插入数据,查询
下载链接:https://pan.baidu.com/s/19lM5Q-_BaDbjaO1Pj0SbYg&shfl=sharepset 安装一路Next就行,安装完毕后,进入目录C:\Prog ...
- Spring分页实现PageImpl<T>类
Spring框架中PageImpl<T>类的源码如下: /* * Copyright 2008-2013 the original author or authors. * * Lice ...
- 关于运维之故障复盘篇-Case Study
关于故障的事后复盘,英文名 Case Study是非常有必要做的,当然是根据故障的级别,不可能做到每个故障都Case Study,除非人员和时间充足: 文档能力也是能力的一种,一般工程师的文档能力比较 ...
- JKD1.8新特性
1.Optional类 Optional是jdk1.8引入的类型,Optional是一个容器对象,它包括了我们需要的对象,使用isPresent方法判断所包 含对象是否为空,isPresent方法返回 ...
- Vulnhub-XXE靶机学习
------------恢复内容开始------------ 前两天在微信公众号上看见了这个XXE靶场,就想试一试,虽然网上关于这个的文章已经写了太多太多了,但还是要写出来划划水,233333333, ...
- Python学习笔记——esle和with 语句
1. else与while组合 def showMaxFactor(num): count = num // 2 while count > 1: if num % count == 0: pr ...
- spring中@Profile的作用
根据系统环境的不同,Profile可以用来切换数据源.例如切换开发,测试,生产环境的数据源. 举个例子: 先创建配置类MainProfileConfig: @Configuration @Proper ...
- MapReduce 框架原理
1. Hadoop 序列化 1.1 自定义Bean对象实现序列化接口 必须实现 Writable 接口: 反序列化时,需要反射调用空参构造函数,所以必须有空参构造: 重写序列化方法: 重写反序列化方法 ...
- (模板)求逆矩阵luoguP4783
题目链接:https://www.luogu.org/problem/P4783 题意:求矩阵的逆. 思路:高斯消元法求矩阵的逆,n为400,卡常,我是开了O2优化才AC的.. AC代码: #incl ...