一 环境介绍

  • 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

参考:https://blogs.msdn.microsoft.com/avkashchauhan/2011/11/12/windows-azure-load-balancer-timeout-details/

  • 同样的情况也出现在了微软的Azure Load Balancer。

参考:https://blogs.msdn.microsoft.com/avkashchauhan/2011/11/12/windows-azure-load-balancer-timeout-details/

四 解决方案

(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异常问题的更多相关文章

  1. springboot集成mongoDB 异常认证

    1.springboot连接mongoDB 出现异常认证 异常详情: com.mongodb.MongoSecurityException: Exception authenticating Mong ...

  2. springboot操作mongodb

    springboot操作mongodb 采用MongoRepository操作mongodb springboot版本2.1.2.RELEASE 注意的是:在运行应用程序时,会报错OSS Algori ...

  3. 实例讲解Springboot整合MongoDB进行CRUD操作的两种方式

    1 简介 Springboot是最简单的使用Spring的方式,而MongoDB是最流行的NoSQL数据库.两者在分布式.微服务架构中使用率极高,本文将用实例介绍如何在Springboot中整合Mon ...

  4. SpringBoot 整合 MongoDB 实战介绍

    一.介绍 在前面的文章中,我们详细的介绍了 MongoDB 的配置和使用,如果你对 MongoDB 还不是很了解,也没关系,在 MongoDB 中有三个比较重要的名词:数据库.集合.文档! 数据库(D ...

  5. java操作mongodb & springboot整合mongodb

    简单的研究原生API操作MongoDB以及封装的工具类操作,最后也会研究整合spring之后作为dao层的完整的操作. 1.原生的API操作 pom.xml <!-- https://mvnre ...

  6. SpringBoot整合mongoDB

    MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 这一片文章介绍一个springboot整合mongodb,如果你了解整合mysql之类的 ...

  7. SpringBoot与mongodb的结合

    本文系列文章: ​ 使用Shell 操作 MongoDB的技巧 ​ MongoTemplate的使用技巧及其注意事项 敬请期待. 前言 最近公司想要做一个用户行为数据的收集,最开始想用mysql来存储 ...

  8. SpringBoot操作MongoDB实现增删改查

    本篇博客主讲如何使用SpringBoot操作MongoDB. SpringBoot操作MongoDB实现增删改查 (1)pom.xml引入依赖 <dependency> <group ...

  9. SpringBoot结合MongoDB入门

    MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系 ...

随机推荐

  1. python获取当前py文件的文件名或者当前工具箱的名字

    #########################import arcpy import osimport sys ########################################## ...

  2. kafka----简单的脚本命令重点

    kafka命令如下: kafka-shell基本命令 在节点hadoop-2,hadoop-3,hadoop-5,启动kafka 启动命令如下 kafka-server-start.sh /usr/l ...

  3. yum搭建LAMP环境

    LAMP=Linux+Apache(httpd)+Mysql(mariadb)+PHP Apache HTTP 服务器 2.4 文档:http://httpd.apache.org/docs/2.4/ ...

  4. 面向对象ALV选择列

    通过  gs_layout-box_fname  = 'SEL'.设置选择行,不能取到 SEL列的值 找资料:作者:f122300349 来源:CSDN 原文:https://blog.csdn.ne ...

  5. EasyUI入门配置

    EasyUI是一款基于jQuery的前端插件,简化了开发,免去编写复杂的js和css即可实现不错的显示效果. 基本配置: index.html <!DOCTYPE html> <ht ...

  6. [Java]1.两数之和 - LeetCode

    1 题目 2 思路与代码 思路一:暴力法(两层For循环) 时间复杂度:O(n^2) 对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 O(n) 的时间.因此时间复杂度为 ...

  7. 使用apache commons csv解析del(类似csv)格式文件

    del格式类似csv,我这里的测试文件test.del是从DB2数据库中导出来的一组数据. apache commons csv的maven坐标为: <!-- https://mvnreposi ...

  8. OpenCV.概念(读书笔记)

    ZC:学习OpenCV.pdf 1.多通道矩阵(学习OpenCV.pdf) 1.1.在学习opencv的时候看到多通道矩阵这一概率,恳求大神告诉我一下什么意思_百度知道.html(https://zh ...

  9. c++ hex string array 转换 串口常用

    c++ hex string array 转换 效果如下 tset string is follow 0x50 55 0x35 00 10 203040506073031323334ff format ...

  10. 周一不睡觉,也要把pandas groupy 肝完,你该这么学,No.8

    如果图片无法观看,请移步 https://blog.csdn.net/hihell 学编程就跟打游戏一样一样的 为啥一样啊,因为要肝的 你看,学编程有很多好处 掉头发,有借口吧 不洗头,有借口吧 不洗 ...