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 是一个介于关系数据库和非关系数据库之间的产品,是非关系 ...
随机推荐
- OAuth2.0的四种授权模式
1.什么是OAuth2 OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OA ...
- Mac下持续集成-与JMeter与Ant执行后自动发送邮件的整合+定时任务
mac定时任务的开启: Last login: Tue Aug 13 22:49:54 on ttys004 (base) localhost:~ ligaijiang$ sudo launchctl ...
- Android中利用jsoup解析html页面
学习jsoup :jsoup学习网站 Android 中使用: 添加依赖 implementation 'org.jsoup:jsoup:1.10.1' 直接上代码: package com.load ...
- 网络编程三要素之IP
用来标示我们计算机在互联网上的唯一性 每个设备在网络中的唯一标识 每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址. ipconfig:查看本机IP192.168.12.4 ...
- 007-log-log4j2、slf4j+log4j2
一.概述 而log4j2的性能无论在同步日志模式还是异步日志模式下都是最佳的. 根本原因在于log4j2使用了LMAX, 一个无锁的线程间通信库代替了, logback和log4j之前的队列. 并发性 ...
- ubuntu tensorflow cpu faster-rcnn 测试自己训练的模型
(flappbird) luo@luo-All-Series:~/MyFile/tf-faster-rcnn_box$ (flappbird) luo@luo-All-Series:~/MyFile/ ...
- Ultimate Guide to Line For Business (May 2019)
Ultimate Guide to Line For Business (May 2019) By Iaroslav Kudritskiy February 4, 2019 No Comments I ...
- 一步步分析Java深拷贝的两种方式-clone和序列化
今天遇到一道面试题,询问深拷贝的两种方法.主要就是clone方法和序列化方法.今天就来分析一下这两种方式如何实现深拷贝.如果想跳过解析的朋友,直奔"重点来了!"寻找答案. clon ...
- Windows 10 下如何彻底关闭 Hyper-V 服务
以管理员身份运行命令提示符 执行命令 bcdedit /set hypervisorlaunchtype off 重启,运行vm即可. 如果想要恢复hyper启动 bcdedit / set hype ...
- 2019Java常见面试下
1.集合的作用是什么? 数据的传送增.删.改.查.constainsAll,可以存放不同类型的对象. 2.集合的通用方法有那些?通用方法是什么?(操作) 集合List的遍历方法有: Iterator: ...