MongoDB基础

1.MongoDB介绍

1.1 MongoDB基础说明

MongoDB是一个文档数据库(以 JSON 为数据模型),由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。

文档来自于“JSON Document”,并非我们一般理解的 PDF,WORD 文档。

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,数据格式是BSON,一种类似JSON的二进制形式的存储格式,简称Binary JSON ,和JSON一样支持内嵌的文档对象和数组对象,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。原则上 Oracle 和 MySQL 能做的事情,MongoDB 都能做(包括 ACID 事务)。

MongoDB是一个开源OLTP数据库,它灵活的文档模型(JSON)非常适合敏捷式开发、高可用和水平扩展的大数据应用。

OLTP:on-line Transaction Processing,联机(在线)事务处理

OLAP:on-line Analytical Processing,联机(在线)分析处理

MongoDB在数据库总排名第5,仅次于Oracle、MySQL等RDBMS,在NoSQL数据库排名首位。从诞生以来,其项目应用广度、社区活跃指数持续上升。

1.2MongoDB 版本变迁

img

1.3 MongoDB vs 关系型数据库

概念

MongoDB概念与关系型数据库(RDBMS)非常类似:

img

数据库(database):最外层的概念,可以理解为逻辑上的名称空间,一个数据库包含多个不同名称的集合。

集合(collection):相当于SQL中的表,一个集合可以存放多个不同的文档。

文档(document):一个文档相当于数据表中的一行,由多个不同的字段组成。

字段(field):文档中的一个属性,等同于列(column)。

索引(index):独立的检索式数据结构,与SQL概念一致。

_id:每个文档中都拥有一个唯一的_id字段,相当于SQL中的主键(primary key)。

视图(view):可以看作一种虚拟的(非真实存在的)集合,与SQL中的视图类似。从MongoDB 3.4版本开始提供了视图功能,其通过聚合管道技术实现。

聚合操作($lookup):MongoDB用于实现“类似”表连接(tablejoin)的聚合操作符。

img

1.4 MongoDB技术优势

MongoDB基于灵活的JSON文档模型,非常适合敏捷式的快速开发。与此同时,其与生俱来的高可用、高水平扩展能力使得它在处理海量、高并发的数据应用时颇具优势。

JSON 结构和对象模型接近,开发代码量低

JSON的动态模型意味着更容易响应新的业务需求

复制集提供99.999%高可用

分片架构支持海量数据和无缝扩容

简单直观:从错综复杂的关系模型到一目了然的对象模型

img

快速:最简单快速的开发方式>

img

灵活:快速响应业务变化

img

MongoDB优势:原生的高可用>

img

MongoDB优势:横向扩展能力

img

1.5 MongoDB应用场景

从目前阿里云 MongoDB 云数据库上的用户看,MongoDB 的应用已经渗透到各个领域:

游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新;

物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来;

社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能;

物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析;

视频直播,使用 MongoDB 存储用户信息、礼物信息等;

大数据应用,使用云数据库MongoDB作为大数据的云存储系统,随时进行数据提取分析,掌握行业动态。|

国内外知名互联网公司都在使用MongoDB:

img

如何考虑是否选择MongoDB?

没有某个业务场景必须要使用MongoDB才能解决,但使用MongoDB通常能让你以更低的成本解决问题。如果你不清楚当前业务是否适合使用MongoDB,可以通过做几道选择题来辅助决策。

只要有一项需求满足就可以考虑使用MongoDB,匹配越多,选择MongoDB越合适。

img

2.MongoDB快速开始

2.1 linux安装MongoDB

  • 环境准备:

    • linux系统: centos7

    • 安装MongoDB社区版

    • 下载MongoDB Community Server :下载地址:https://www.mongodb.com/try/download/community

      wget https://fas[tdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.9.tgz](https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.9.tgz)
      
      tar -zxvf mongod[b-linux-x86_64-rhel70-4.4.9.tgz](https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.9.tgz)
      
      
    • 启动

      # 启动MongoDB Server
      
      # 创建dbpath和logpath
      
      mkdir -p /mongodb/data /mongodb/log  
      
      # 进入mongodb目录,启动mongodb服务
      
      bin/mongod --port=27017 --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log \
      
      --bind_ip=0.0.0.0 --fork
      
      --dbpath :指定数据文件存放目录
      
      --logpath :指定日志文件,注意是指定文件不是目录
      
      --logappend :使用追加的方式记录日志
      
      --port:指定端口,默认为27017
      
      --bind_ip:默认只监听localhost网卡
      
      --fork: 后台启动
      
      --auth: 开启认证模式
      
      # 添加环境变量
      
      # 修改/etc/profile,添加环境变量,方便执行MongoDB命令
      
      export MONGODB_HOME=/usr/local/soft/mongodb
      
      PATH=$PATH:$MONGODB_HOME/bin  
      
      # 然后执行source /etc/profile 重新加载环境变量
      
    • 利用配置文件启动服务,编辑/mongodb/conf/mongo.conf文件,内容如下:

      systemLog:
      
       destination: file
      
       path: /mongodb/log/mongod.log # log path
      
       logAppend: true
      
      storage:
      
       dbPath: /mongodb/data # data directory
      
       engine: wiredTiger  #存储引擎
      
       journal:       #是否启用journal日志
      
        enabled: true
      
      net:
      
       bindIp: 0.0.0.0
      
       port: 27017 # port
      
      processManagement:
      
       fork: true
      
      # 注意:一定要yaml格式
      # 启动mongod
      
      mongod -f /mongodb/conf/mongo.conf
      
      # -f 选项表示将使用配置文件启动mongodb
      
    • 关闭MongoDB服务

      # 方式1:
      mongod --port=27017 --dbpath=/mongodb/data --shutdown 
      
      # 方式2:进入mongo shell
      use admin
      db.shutdownServer()
      

2.2 Mongo shell使用

mongo是MongoDB的交互式JavaScript Shell界面,它为系统管理员提供了强大的界面,并为开发人员提供了直接测试数据库查询和操作的方法。

bin/mongo --port=27017

bin/mongo localhost:27017

--port:指定端口,默认为27017

--host:连接的主机地址,默认127.0.0.1

img

JavaScript支持

mongo shell是基于JavaScript语法的,MongoDB使用了SpiderMonkey作为其内部的JavaScript解释器引擎,这是由Mozilla官方提供的JavaScript内核解释器,该解释器也被同样用于大名鼎鼎的Firefox浏览器产品之中。SpiderMonkey对ECMA Script标准兼容性非常好,可以支持ECMA Script 6。可以通过下面的命令检查JavaScript解释器的版本:

mongo shell常用命令

命令 说明
show dbs | show databases 显示数据库列表
use 数据库名 切换数据库,如果不存在创建数据库
db.dropDatabase() 删除数据库
show collections | show tables 显示当前数据库的集合列表
db.集合名.stats() 查看集合详情
db.集合名.drop() 删除集合
show users 显示当前数据库的用户列表
show roles 显示当前数据库的角色列表
show profile 显示最近发生的操作
load("xxx.js") 执行一个JavaScript脚本文件
exit | quit() 退出当前shell
help 查看mongodb支持哪些命令
db.help() 查询当前数据库支持的方法
db.集合名.help() 显示集合的帮助信息
db.version() 查看数据库版本

2.3数据库常用操作

  • 查看所有库

    show dbs
    
  • 切换到指定数据库,不存在则创建

    use test
    
  • 删除当前数据库

    db.dropDatabase()
    
  • 查看集合

    show collections
    
  • 创建集合(db.createCollection(name, options))

    db.createCollection("test")
    
  • 删除集合

    db.test.drop()
    

固定集合

  • 固定集合(capped collection)是一种限定大小的集合,其中capped是覆盖、限额的意思。跟普通的集合相比,数据在写入这种集合时遵循FIFO原则。可以将这种集合想象为一个环状的队列,新文档在写入时会被插入队列的末尾,如果队列已满,那么之前的文档就会被新写入的文档所覆盖。通过固定集合的大小,我们可以保证数据库只会存储“限额”的数据,超过该限额的旧数据都会被丢弃。img

  • 使用示例 创建固定集合

    db.createCollection("logs",{capped:true,size:4096,max:10})
    
    # max:指集合的文档数量最大值,这里是10条
    # size:指集合的空间占用最大值,这里是4096字节(4KB)
    # 这两个参数会同时对集合的上限产生影响。也就是说,只要任一条件达到阈值都会认为集合已经写满。其中size是必选的,# 而max则是可选的。
    

    测试 尝试在这个集合中插入15条数据,再查询会发现,由于文档数量上限被设定为10条,前面插入的5条数据已经被覆盖# 了

    for(var i=0;i<15;i++){
    db.logs.insert({t:"row-"+i})
    }

    
    

img

优势与限制

固定集合在底层使用的是顺序I/O操作,而普通集合使用的是随机I/O。顺序I/O在磁盘操作上由于寻道次数少而比随机I/O要高效得多,因此固定集合的写入性能是很高的。此外,如果按写入顺序进行数据读取,也会获得非常好的性能表现。

但它也存在一些限制,主要有如下4个方面:

无法动态修改存储的上限,如果需要修改max或size,则只能先执行collection.drop命令,将集合删除后再重新创建。

无法删除已有的数据,对固定集合中的数据进行删除将会得到如下错误:img 对已有数据进行修改,新文档大小必须与原来的文档大小一致,否则不允许更新:img 默认情况下,固定集合只有一个_id索引,而且最好是按数据写入的顺序进行读取。当然,也可以添加新的索引,但这会降低数据写入的性能。

适用场景

固定集合很适合用来存储一些“临时态”的数据。“临时态”意味着数据在一定程度上可以被丢弃。同时,用户还应该更关注最新的数据,随着时间的推移,数据的重要性逐渐降低,直至被淘汰处理。

一些适用的场景如下:

系统日志,这非常符合固定集合的特征,而日志系统通常也只需要一个固定的空间来存放日志。在MongoDB内部,副本集的同步日志(oplog)就使用了固定集合。

存储少量文档,如最新发布的TopN条文章信息。得益于内部缓存的作用,对于这种少量文档的查询是非常高效的。

2.4 安全认证

# 创建管理员账号
# 设置管理员用户名密码需要切换到admin库
use admin  

#创建管理员
db.createUser({user:"zhangsan",pwd:"zhangsan",roles:["root"]})

# 查看当前数据库所有用户信息 
show users 

#显示可设置权限
show roles 

#显示所有用户
db.system.users.find() 

2.5常用权限

# 重新赋予用户操作权限

db.grantRolesToUser( "zhangsan" , [ 

 { role: "clusterAdmin", db: "admin" } ,

  { role: "userAdminAnyDatabase", db: "admin"},

  { role: "userAdminAnyDatabase", db: "admin"},

  { role: "readWriteAnyDatabase", db: "admin"} 

])

# 删除用户
db.dropUser("zhangsan")

#删除当前数据库所有用户
db.dropAllUser()

3.MongoDB文档操作

3.1 插入文档

  • 3.2 版本之后新增了 db.collection.insertOne() 和 db.collection.insertMany()。

  • 新增单个文档

    • insertOne: 支持writeConcern

    • writeConcern 决定一个写操作落到多少个节点上才算成功。writeConcern 的取值包括:

      • 0:发起写操作,不关心是否成功;
      • 1: 集群最大数据节点数:写操作需要被复制到指定节点数才算成功;
    • majority:写操作需要被复制到大多数节点上才算成功。

    • insert: 若插入的数据主键已经存在,则会抛 DuplicateKeyException 异常,提示主键重复,不保存当前数据。

      db.emp.insert({"name":"zhangsan","age":"25"})
      db.emp.insert([
      
      {"name":"lisi","age":"26"},
      
      {"name":"wangwu","age":"27"}
      
      ])
      

    ​ save: 如果 _id 主键存在则更新数据,如果不存在就插入数据。

  • 批量新增文档

    • insertMany:向指定集合中插入多条文档数据
    • db.emp.insertMany([{name:"liuwei",age:23},{name:"zhaoqi",age:38}])
    • insert和save也可以实现批量插入

3.2 查询文档

  • find 查询集合中的若干文档。语法格式如下:
db.collection.find(query, projection)

query :可选,使用查询操作符指定查询条件

projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。投影时,_id为1的时候,其他字段必须是1;_id是0的时候,其他字段可以是0;如果没有_id字段约束,多个其他字段必须同为0或同为1。img

如果查询返回的条目数量较多,mongo shell则会自动实现分批显示。默认情况下每次只显示20条,可以输入it命令读取下一批。

db.books.find({title:"book-20"})

db.books.find({type:"travel",tag:"developer"})

db.books.find({type:"travel",tag:"developer"},{title:1})

db.books.find({type:"travel",tag:"developer"},{title:0})

# findOne查询集合中的第一个文档。语法格式如下:

db.collection.findOne(query, projection)

db.books.findOne({type:"travel",tag:"developer"},{title:0})

img

如果你需要以易读的方式来读取数据,可以使用pretty)方法,语法格式如下:

db.collection.find().pretty()

注意:pretty()方法以格式化的方式来显示所有文档

3.2条件查询

  • 指定条件查询

    #查询带有nosql标签的book文档:
    db.books.find({tag:"nosql"})
    
    #按照id查询单个book文档:
    db.books.find({_id:ObjectId("61caa09ee0782536660494d9")})
    
    #查询分类为“travel”、收藏数超过60个的book文档:
    db.books.find({type:"travel",favCount:{$gt:60}})
    
    db.books.find({type:"travel",favCount:{$in:[34,1,42]}})
    
  • 查询条件对照表

    SQL MQL
    a = 1
    a <> 1 {a: {$ne: 1}}
    a > 1 {a: {$gt: 1}}
    a >= 1 {a: {$gte: 1}}
    a < 1 {a: {$lt: 1}}
    a <= 1 {a: {$lte: 1}}
  • 查询逻辑对照表

    SQL MQL
    a = 1 AND b = 1 {a: 1, b: 1}或{$and: [{a: 1}, {b: 1}]}
    a = 1 OR b = 1 {$or: [{a: 1}, {b: 1}]}
    a IS NULL {a: {$exists: false}}
    a IN (1, 2, 3) {a: {$in: [1, 2, 3]}}
  • 查询逻辑运算符

    $lt: 存在并小于

    $lte: 存在并小于等于

    $gt: 存在并大于

    $gte: 存在并大于等于

    $ne: 不存在或存在但不等于

    $in: 存在并在指定数组中

    $nin: 不存在或不在指定数组中

    $or: 匹配两个或多个条件中的一个

    $and: 匹配全部条件

  • 排序&分页

    在 MongoDB 中使用 sort() 方法对数据进行排序

    db.books.find({type:"travel"}).sort({favCount:-1})
    

    1 为升序排列,而 -1 是用于降序排列

  • 分页查询

    skip用于指定跳过记录数,limit则用于限定返回结果数量。可以在执行find命令的同时指定skip、limit参数,以此实现分页的功能。比如,假定每页大小为8条,查询第3页的book文档:

    db.books.find().skip(5).limit(4)
    

3.3正则表达式匹配查询

MongoDB 使用 $regex 操作符来设置匹配字符串的正则表达式。使用正则表达式查找type包含 so 字符串的book

db.books.find({type:{$regex:"so"}})

# 或者

db.books.find({type:/so/})

3.4 更新文档

  • 可以用update命令对指定的数据进行更新,命令的格式如下:

    1. db.collection.update(query,update,options)
    2. query:描述更新的查询条件;
    3. update:描述更新的动作及新的内容;
    4. options:描述更新的选项
    5. upsert: 可选,如果不存在update的记录,是否插入新的记录。默认false,不插入
    6. multi: 可选,是否按条件查询出的多条记录全部更新。 默认false,只更新找到的第一条记录
    7. writeConcern :可选,决定一个写操作落到多少个节点上才算成功。
  • 更新操作符

    操作符 格式 描述
    $set {$set:{field:value}} 指定一个键并更新值,若键不存在则创建
    $unset {$unset : {field : 1 }} 删除一个键
    $inc {$inc : {field : value } } 对数值类型进行增减
    $rename {$rename : {old_field_name : new_field_name } } 修改字段名称
    $push { $push : {field : value } } 将数值追加到数组中,若数组不存在则会进行初始化
    $pushAll {$pushAll : {field : value_array }} 追加多个值到一个数组字段内
    $pull {$pull : {field : _value } } 从数组中删除指定的元素
    $addToSet {$addToSet : {field : value } } 添加元素到数组中,具有排重功能
    $pop {$pop : {field : 1 }} 删除数组的第一个或最后一个元素
  • 更新单个文档

    db.books.update({_id:ObjectId("645da57d5e85df693c71125f")},{$inc:{favCount:1}})
    
    db.books.find({tag:"nosql"})
    
    db.books.update({tag:"nosql"},{$set:{publishDate:new Date()}})
    

    某个book文档被收藏了,则需要将该文档的favCount字段自增

  • 更新多个文档

    默认情况下,update命令只在更新第一个文档之后返回,如果需要更新多个文档,则可以使用multi选项。

    将分类为“novel”的文档的增加发布时间(publishedDate)

    db.books.update({type:"nosql"},{$set:{publishedDate:new Date()}},{"multi":true})
    

    multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新

    update命令的选项配置较多,为了简化使用还可以使用一些快捷命令:

    1. updateOne:更新单个文档。

    2. updateMany:更新多个文档。

      db.books.updateMany({tag:"nosql"},{$set:{publishDate:new Date()}})
      
    3. replaceOne:替换单个文档。

  • 使用upsert命令

    upsert是一种特殊的更新,其表现为如果目标文档不存在,则执行插入命令。

    db.books.update(
    
      {title:"my book"},
    
      {$set:{tags:["nosql","mongodb"],type:"none",author:"zhangsan"}},
    
      {upsert:true}
    
    )
    

    nMatched、nModified都为0,表示没有文档被匹配及更新,nUpserted=1提示执行了upsert动作

  • 实现replace语义

    update命令中的更新描述(update)通常由操作符描述,如果更新描述中不包含任何操作符,那么MongoDB会实现文档的

    db.books.update(
    
      {title:"my book"},
    
      {justTitle:"my first book"}
    
    )   
    
     
    
    db.books.find({justTitle:"my first book"})
    
    
    
  • findAndModify命令

    findAndModify兼容了查询和修改指定文档的功能,findAndModify只能更新单个文档

    db.books.findAndModify({
    
      query:{_id:ObjectId("645da57d5e85df693c71123c")},
    
      update:{$inc:{favCount:1}}
    
    })
    

    将某个book文档的收藏数(favCount)加1。该操作会返回符合查询条件的文档数据,并完成对文档的修改。默认情况下,findAndModify会返回修改前的“旧”数据。如果希望返回修改后的数据,则可以指定new选项

    db.books.findAndModify({
    
      query:{_id:ObjectId("645ccb4dc980b389075ece23")},
    
      update:{$inc:{favCount:1}},
    
      new: true
    
    })
    

    与findAndModify语义相近的命令如下:

    1. findOneAndUpdate:更新单个文档并返回更新前(或更新后)的文档。
    2. findOneAndReplace:替换单个文档并返回替换前(或替换后)的文档。

3.5删除文档

  • 使用 remove 删除文档

    remove 命令需要配合查询条件使用;

    匹配查询条件的文档会被删除;

    指定一个空文档条件会删除所有文档;

    示例:

    db.user.remove({age:28}) # 删除age 等于28的记录
    
    db.user.remove({age:{$lt:25}})  # 删除age 小于25的记录
    
    db.user.remove( { } ) # 删除所有记录
    
    db.user.remove() # 报错
    
    # remove命令会删除匹配条件的全部文档,如果希望明确限定只删除一个文档,则需要指定justOne参数,命令格式如下:
    
    db.collection.remove(query,justOne)
    
    # 例如:删除满足type:novel条件的首条记录
    
    db.books.find({type:"novel"})
    
    db.books.remove({type:"novel"},true)
    
    
    

    官方推荐使用 deleteOne() 和 deleteMany() 方法删除文档,语法格式如下:

    db.books.deleteMany ({}) //删除集合下全部文档

    db.books.deleteMany ({ type:"novel" }) //删除 type等于 novel 的全部文档

    db.books.deleteOne ({ type:"novel" }) //删除 type等于novel 的一个文档

    注意: remove、deleteMany等命令需要对查询范围内的文档逐个删除,如果希望删除整个集合,则使用drop命令会更加高效

  • 使用 delete 删除文档

    官方推荐使用 deleteOne() 和 deleteMany() 方法删除文档,语法格式如下:

    db.books.deleteMany ({})  # 删除集合下全部文档
    
    db.books.deleteMany ({ type:"novel" })  # 删除 type等于 novel 的全部文档
    
    db.books.deleteOne ({ type:"novel" })  # 删除 type等于novel 的一个文档
    
    
    

    注意: remove、deleteMany等命令需要对查询范围内的文档逐个删除,如果希望删除整个集合,则使用drop命令会更加高效

  • 返回被删除文档

    remove、deleteOne等命令在删除文档后只会返回确认性的信息,如果希望获得被删除的文档,则可以使用findOneAndDelete命令

    db.books.findOneAndDelete({type:"novel"})
    

4.MongoDB整合SpringBoot

4.1 MongoDB连接池参数

  • 获取连接

    • minConnectionsPerHost:最小连接数。空闲时,这些连接将保存在一个池中,池将确保随着时间的推移,它至少包含这个最小数目。
    • maxConnectionsPerHost:最大连接数。决定了连接池中最多可以存储多少个连接,超过该数量的连接将被阻塞等待或者丢弃。
    • threadsAllowedToBlockForConnectionMultiplier:等待连接的乘数,通过该值能计算最多有多少个线程等待连接。例如,如果connectionsPerHost是10,threadsAllowedToBlockForConnectionMultiplier是5,那么最多可以有50个线程等待连接。
    • maxWaitTime:线程等待连接可用的最大等待时间。值为0意味着它不会等待。负值意味着无限地等待。
    • serverSelectionTimeout:连接到MongoDB服务器的最长等待时间。
  • 建立连接

    • connectTimeout:连接超时时间,即连接到MongoDB服务器的最长等待时间。
    • heartbeatFrequency:心跳频率,即MongoDB的健康检查时间间隔。
    • heartbeatConnectTimeout:心跳连接超时时间,即连接到MongoDB服务器的最长等待时间。
  • 发送数据

    • socketTimeout:Socket超时时间,即Socket读取操作的最长等待时间。
    • heartbeatSocketTimeout:心跳Socket超时时间,即Socket读取操作的最长等待时间。
  • 断开连接

    • maxConnectionIdleTime:连接最大空闲时间,即连接在空闲一段时间后是否被标记为过期。过期的连接可以从连接池中移除或重用。
    • maxConnectionLifeTime:连接最大生命周期,即连接在使用一段时间后是否被标记为过期。过期的连接可以从连接池中移除或重用。
    • socketKeepAlive:设置为true时,连接池将定期发送TCP keepalive消息以防止连接在网络故障或其他原因下被断开。
  • 超过阈值的异常信息

    参数 异常信息
    connectionTimeout Caused by: java.net.SocketTimeoutException: Connect timed out at java.net.SocksSocketImpl.readSocksReply(SocksSocketImpl.java:126) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:459)
    maxWaitTime Caused by: com.mongodb.MongoTimeoutException: Timeout waiting for a pooled item after 15 MILLISECONDS at com.mongodb.internal.connection.ConcurrentPool.get(ConcurrentPool.java:127) at com.mongodb.connection.DefaultConnectionPool.getPooledConnection(DefaultConnectionPool.java:258) at com.mongodb.connection.DefaultConnectionPool.get(DefaultConnectionPool.java:99) at com.mongodb.connection.DefaultConnectionPool.get(DefaultConnectionPool.java:88)
    socketTimeout Caused by: java.net.SocketTimeoutException: Read timed out at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) at java.net.SocketInputStream.read(SocketInputStream.java:171) at java.net.SocketInputStream.read(SocketInputStream.java:141)
    threadsAllowedToBlockForConnectionMultiplier org.springframework.data.mongodb.UncategorizedMongoDbException: Too many threads are already waiting for a connection. Max number of threads (maxWaitQueueSize) of 2 has been exceeded.; nested exception is com.mongodb.MongoWaitQueueFullException: Too many threads are already waiting for a connection. Max number of threads (maxWaitQueueSize) of 2 has been exceeded. at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:107) at org.springframework.data.mongodb.core.MongoTemplate.potentiallyConvertRuntimeException(MongoTemplate.java:2135) at org.springframework.data.mongodb.core.MongoTemplate.executeFindOneInternal(MongoTemplate.java:1925)
posted @ 2023-05-12 20:22  ityml  阅读(183)  评论(0编辑  收藏  举报