mongoDB操作完数据库是否需要断开

2023-11-13

1.引言

    最近在优化后端接口的时候,因为不同接口都需要去操作数据库,这就产生了一个疑惑,我是应该一直连着还是连接并操作完数据库之后断开连接呢,然后每次需要操作数据库连接,然后关闭,这样有点尴尬,一个接口对应一次连接和断开,是不是有点憨憨的,但是如果我不断开,会不会导致连接池达到上限呢?最近又想了想,觉得自己有点想偏了,一定好记得看第7部分(狗头保命)。
    结论建议操作数据库之后不断开连接,也就是最常理解的那种。

2.问题分析

    一般数据库操作都是追求安全的,也就意味着大概率使用TCP连接,一搜,果然是TCP。那么问题就来了TCP是长连接,你不断开他就一直连着。如果我们只看一次连接需要消耗的资源,不设置连接池的话,那么数据库不断开,一直连一直连,那么迟早会耗尽服务端的资源,为什么这么说呢,应为客户端远比服务端多的多(一般服务端就是一个内存还不如客户端的Linux系统)。所以连接池机制还是很有必要的

3.佐证

    还是有点半信半疑,于是我去搜了搜后端数据库操作数据之后是否需要断开与数据库的连接?。好巧不巧,遇到了Java老大哥里面的jdbc,网上说jdbc不需要断开连接,因为里面的finally会主动帮助断开连接,设置有些大佬还提到一些框架是能够主动帮助我们断开与数据库的连接的。这也就解释了为什么,很多时候都没有这个断开数据库连接的习惯。这些本质是框架自己完成的,即需要断开连接。

4.分析目标mongoDB

    我这里的项目是使用koa框架,里面用的是mongoDB第三方依赖,官网中给出的实例代码如下:
在这里插入图片描述
可以看出需要主动断开连接,另外还有人用复杂一点的mongoose连接数据库,嘿嘿,一搜发现mongoose自带连接池,那就是也需要断开连接的,和jdbc一样,它帮我们完成了。

5.实际测试

    如果真的有连接限制,那么就如同大佬说的那样,连接过多会变慢,就像是很多人挤进操场和一个人去操场一样。那我直接连接多次mongoDB,看看会发生什么吧,程序代码如下:

const dbUserName = "用户名";
const dbPassWord = "用户密码";
const targetDataBase = "连接的数据库";
const url = `mongodb://${dbUserName}:${dbPassWord}@远程ipAddress/${targetDataBase}`;
const { MongoClient } = require("mongodb");
module.exports = async (ctx) => {
  let isSuccess = true;
  let success = 0;
  let fail = 0;
  let timer = setInterval(() => {
    const client = new MongoClient(url);
    client
      .connect()
      .then((res) => {
        console.log("连接成功:", res);
        success++;
      })
      .catch((err) => {
        console.log("连接失败:", err);
        isSuccess = false;
        fail++;
        clearInterval(timer);
      })
      .finally(() => {
        console.log("完成" + success + "次测试", "失败" + fail + "次测试");
      });
  }, 100);
};

    当然运行的时候由于连接失败程序直接崩了,promise里面的数据没有打印,也就是具体能连多少还是看不出来:
在这里插入图片描述
    第一次测试是在重启了mongoDB的情况下进行的,然后我测一下接口,发现还是能连接,然后没有重启又测了一次:
在这里插入图片描述
    可以明显看出timeout,也就是真的“挤”不进去了。
    为了确认我又去看了下服务器的日志:
在这里插入图片描述
    好家伙,服务器把锅给了客户端,说这是客户端主动断开连接。那现在连接池很卡了,我接着连会不会直接报错呢?看来这个连接池是相对卡顿的。补充这里的setInterval,这个停下来会比预想的慢,因为发出去的请求是否成功,setInterval管不了,只是在失败的那一次停止,之前已经发出去的的可能也还有失败的)。
    好接下来反向论证一下,将finally里面的关闭连接(client.close()),得到如下结果:
在这里插入图片描述
    这个是我主动关闭连接,因为是函数里面调用,也不存在内存不够的情况,理论上无穷次连接。

6.得出结论

    使用mongoDB数据库的时候,如果使用mongoose依赖,内部具有默认连接池,不需要关闭连接,如果使用mongoDB依赖,需要主动关闭连接,不关闭连接,最大连接大概在700左右,在连接峰期结束之后还能恢复正常。如果主动关闭连接,那么连接次数就是无穷次。

7.狗头保命

    在实际开发中,最终想到的解决方法如下:
在这里插入图片描述
在这里插入图片描述
    简单说下思路:思路比较简单,就是每次用户请求接口的时候连接数据库,到最后由于用户发送数据完毕,无论成功还是失败都需要封装数据体,也就是下面这个:
在这里插入图片描述
    所以只需要再最后的函数里面关闭数据库连接,最终只需要在封装数据体的函数里面关闭连接。
    好接下来说一说,面临的选择问题,搜集相关信息的时候,发现mongoose的连接池里面之后10个不到,我顿时想起来是自己想错了,把服务端像客户端一样看待了。其实用户每次访问应用,数据库的连接不是由用户发起的,而是服务启动的时候开启的。也就是说重启服务对应数据库的一次连接并且这个连接将一直保持。如果设置成使用接口打开连接,并在发送完数据关闭连接就会导致出现不必要的延时。最终的话还是建议不关闭连接,毕竟连接数据库的用户和客户端相比简直没有

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mongoDB操作完数据库是否需要断开 的相关文章

随机推荐

  • excluded by a filter_【互宠】【强强】日后再说by画尘埃

    将公众号设为 星标 不错过每一次更新 图片源自网络 侵删 日后再说 by画尘埃 小狼狗帅攻 x 肤白貌美武力值高sl受 余睿 x 宴锦书 强受 互宠 有车 he 文案 如果硬要写属性的话 大概就是 难以形容只知道他很帅攻 x 肤白貌美腰细腿
  • 【Tomcat】在SpringBoot项目中,Tomcat是如何处理HTTP请求的

    目录 首先了解一下标准的Tomcat处理HTTP请求的流程 SpringBoot项目中Tomcat处理流程 首先了解一下标准的Tomcat处理HTTP请求的流程 监听端口 Tomcat 在启动时监听指定的端口 等待客户端发送请求 接收请求
  • 参考文献的交叉引用

    文章目录 插入参考文献 寻找参考文献 参考文献顺序更新 我们在写论文的时候需要引用参考文献 一般我们使用的是交叉引用 下面我详细的讲述一下如果在参考文献处加入交叉引用 插入参考文献 寻找参考文献 参考文献顺序更新 像上图 我们发现参考文献的
  • 单片机实时温度采集并通过串口通信上传电脑显示

    首先说下我所用到的主要器件器件 STC89C52 AT24C08 DS18B20 MAX232 实验源代码 接上18B20温度传感器 另购 后数码管显示出当前温度 include
  • 找出连续最长数字串python_在Python中查找最长的连续字母和数字子字符串

    给定的字符串可以是数字和字母的混合 在本文中 我们需要找到同时包含字母和数字的最大子字符串 带重新模块 正则表达式模块可用于查找所有具有数字或字母的连续子字符串 然后 我们应用max函数仅选择在所有找到的子字符串中具有最大长度的字母和数字的
  • LQR,iLQR,DDP控制论经典算法(MBRL基础知识)

    深度强化学习CS285 lec10 lec12 基础知识LQR Framework 一 线性二次型调节器LQR Linear Quadratic Regulator 1 1 LQR符号与术语 1 2 LQR问题下的设定 1 3 LQR求解
  • 前端学习笔记

    1 JS的控制台对象 最常用的是的的的的的的的的的的的console log 在控制台输出内容 详解链接 2 什么是闭包 有什么用 就是在一个函数中定义并返回了另外一个函数 在这个内部定义的函数中可以访问外面的函数定义的变量 详解链接 3
  • 做生意与打工的区别

    做生意与打工的区别 发现很多朋友创业的心里很矛盾 既有创业单干的激情 同时又有担心失败后悲惨的命运 所以很多朋友思考了很长时间 最后还是决定等等再看 一月过了一月 一年过了又一年 岁月流逝 光阴不再 沉浸在打工的生涯中难以自拔 结婚供房 身
  • Linux编译C程序出现错误“ stray ‘\302'或者'\240' in program”的解决方案 最有效的解决办法

    出现上述错误 是因为源码中出现了 302 或者 240 这些字符我们无法看到 但是并不代表不存在 解决的办法是 将程序拷贝到Notepad 中 点击出现的上述字符的位置 选中一个字符 Notepad会自动选中文本中所有的字符 选中复制 对其
  • 记录swiper3.x版本loop为true轮播踩坑,附带解决方案

    loop为true时 踩坑记录 loop为true时 swiper手动滑动后不再轮播 查看 swiper官网 找到autoplayDisableOnInteraction false参数 设置后 发现没起作用 观察发现 手动滑动时触发了 o
  • leetcode(56)

    题目描述 Given a collection of intervals merge all overlapping intervals For example Given 1 3 2 6 8 10 15 18 return 1 6 8 1
  • 重温数据结构:哈希 哈希函数 哈希表

    点击查看 Java 集合框架深入理解 系列 乾杯 在学习 HashMap 前 我们先来温习下 Hash 哈希 的概念 什么是 Hash Hash 哈希 又称 散列 散列 hash 英文原意是 混杂 拼凑 重新表述 的意思 在某种程度上 散列
  • Pikachu靶场之SSRF服务器端请求伪造

    Pikachu靶场之SSRF服务器端请求伪造 SSRF漏洞介绍 什么是SSRF漏洞 SSRF漏洞原理 SSRF漏洞利用手段 SSRF漏洞防御手段 SSRF漏洞常见出现点 第一关 SSRF curl 1 file协议查看本地文件 2 ftp协
  • Clickhouse表引擎-日志系列

    1 表引擎的介绍 Clickhouse的表引擎类似MySQL的表引擎 表引擎决定了如何存储表的数据 主要包含如下特性 数据的存储方式和位置 写到哪里以及从哪里读取数据 支持哪些查询以及如何支持 并发数据访问 索引的使用 如果存在 是否可以执
  • python 按照修改时间进行文件读取

    函数介绍 os path getmtime path 用于获取指定路径的最后修改时间 此方法返回一个浮点值 该值表示自纪元以来的秒数 如果文件不存在或无法访问 则此方法会引发OSError 参考 Python os path getmtim
  • Oracle 通过CMD 窗口指令登入数据库

    第一步 打开CMD窗口指令 输入sqlplus 第二步 在CMD窗口 输入合法的用户名词 密码
  • nmealib代码分析

    从之前的samples parse main c开始 以其中的一条GPGGA语句为例 nmeaINFO结构汇总的是gps数据信息 里面包括utc时间 定位状态 质量因子 经纬度 速度 方向等信息 之所以说是汇总 那是因为这里是对所有的nme
  • 查看操作系统版本的 N 种方式(Windows、CentOS、Ubuntu、Debian)

    前言 我们使用的各种软件 运行都离不开操作系统 大家都知道操作系统主要有Windows和Linux 如何查看当前操作系统的具体版本 你知道哪些方式呢 1 Windows Windows系统大家都很熟悉 可以用图形界面直接查看 除了用鼠标点点
  • 使用R语言绘制散点图矩阵图

    使用R语言绘制散点图矩阵图 散点图矩阵图 Scatterplot Matrix 是一种常用的数据可视化工具 用于显示多个变量之间的相互关系 在R语言中 可以使用pairs 函数和ggpairs 函数来创建散点图矩阵图 它们提供了灵活的选项和
  • mongoDB操作完数据库是否需要断开

    mongoDB操作完数据库是否需要断开 1 引言 2 问题分析 3 佐证 4 分析目标mongoDB 5 实际测试 6 得出结论 7 狗头保命 1 引言 最近在优化后端接口的时候 因为不同接口都需要去操作数据库 这就产生了一个疑惑 我是应该