Mongodb常见问题

转载自  Mongodb常见问题

一.数据库级锁

MongoDB的锁机制和一般关系数据库如 MySQL(InnoDB), Oracle 有很大的差异,InnoDB 和 Oracle 能提供行级粒度锁,而 MongoDB 2.x 只能提供 库级粒度锁,这意味着当 MongoDB 一个写锁处于占用状态时,其它的读写操作都得干等。

MongoDB 使用的是“readers-writer”锁, 可以支持并发但有很大的局限性,当一个读锁存在,许多读操作可以使用这把锁,然而, 当一个写锁的存在,一个单一的写操作会 exclusively 持有该锁,同时其它读,写操作不能使用共享这个锁;举个例子,假设一个集合里有 10 个文档,多个 update 操作不能并发在这个集合上,即使是更新不同的文档。


初看起来库级锁在大并发环境下有严重的问题,但是 MongoDB 依然能够保持大并发量和高性能,这是因为 MongoDB 的锁粒度虽然很粗放,但是在锁处理机制和关系数据库锁有很大差异,主要表现在:

MongoDB 没有完整事务支持,操作原子性只到单个 document 级别,所以通常操作粒度比较小;
MongoDB 锁实际占用时间是内存数据计算和变更时间,通常很快;
MongoDB 锁有一种临时放弃机制,当出现需要等待慢速 IO 读写数据时,可以先临时放弃,等 IO 完成之后再重新获取锁


在MongoDB 3.0版本中锁的粒度就变得更细了,除了全局锁、数据库锁还加入了集合锁,而且对于WiredTiger存储引擎和MMAPv1存储引擎而言两者之间的锁机制也有不同。 
 WiredTiger:对于大部分的读写操作,WiredTiger使用乐观锁。WiredTiger对于全局、数据库、集合级别只会使用意向锁。当存储引擎检测到两个操作之间的冲突,一个写冲突导致MongoDB透明地重试写操作。一些全局操作,跟2.2版本一样还是会需要全局锁,例如,删除一个集合,那么仍然还是需要一个互斥的数据库锁的。


如何查看锁的状态

db.serverStatus()
db.currentOp()
mongotop
mongostat

产生数据库锁的操作

操作 锁类型
Issue a query Read lock
Get more data from a cursor Read lock
Insert data Write lock
Remove data Write lock
Update data Write lock
Map-reduce Read lock and write lock, unless operations are specified as non-atomic. Portions of map-reduce jobs can run concurrently.
Create an index Building an index in the foreground, which is the default, locks the database for extended periods of time.

db.eval() Write lock.

二.原子操作但不支持事务

所谓原子操作就是要么对这个文档操作全部成功,要么全部失败,不会出现查询到的文档没有保存完整的情况 
mongodb不支持事务,所以,在你的项目中应用时,要注意这点。无论什么设计,都不要要求mongodb保证数据的完整性。但是mongodb对单个文档的操作提供了许多原子操作,比如文档的保存,修改(包括对单个文档修改多个字段),删除等,都是原子操作。

三.插入删除更新瞬时完成

插入删除更新都是瞬时完成的,不需要等待数据库响应。这不属于异步操作,发出指令后就不在操心之后的操作。客户端将文档发给服务器端,就干别的去了,不等待响应。

优点速度快,缺点是操作发送到服务器之后,不管后续服务器是否操作成功,有可能丢数据,(日志,用户点击,或数据分析可以接受,但付费系统不适合)

安全性高的付费系统,可采用安全操作在执行完成之后需调用GETLastERROR检查执行是否成功,然后抛出异常,由前段进行处理

四.单个文件大小限制16M

习惯了使用mongodb中文档(document)存储方式, 可以灵活的将大量数据存入一个集合中的一条文档中, 这样可以减少大量的数据冗余, 不会出现关系性数据库, 如myslq中表的某一列的数据冗余. 不过这样存储虽好, 但其实也会存在一定的问题, 也就是mongodb中的大小限制, 即单个文档大小不能超过16M

对遇到过这个问题的人来说, 这个16M的'概念'很好理解, 而对于还未意识到这个问题的人来说, 这个'坑' 可能会让你花时间都难以发现, 因为这又要牵扯到mongodb的另一个存储机制 ---- 无返回码. 在 < mongodb 权威指南> 一书中, 作者称之为离弦之箭. 什么意思呢, 就是mongodb的插入,删除等操作, 客户端向数据库发出请求之后, 是不需要等待数据库返回操作是否成功的返回结果. 这也是mongodb插入,更新等操作速度快的原因. 这就导致, 当单个文件超过16M之后, 程序并不会报错, 但此时, 数据已经无法插入数据库了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

认识微软Visual Studio Tools for AI

微软已经发布了其 Visual Studio Tools for AI 的测试版本&#xff0c;这是微软 Visual Studio 2017 IDE 的扩展&#xff0c;可以让开发人员和数据科学家将深度学习模型嵌入到应用程序中。Visual Studio Tools for AI 工具同时支持 Microsoft 的 Cognitive Toolkit 和 Google 的…

P1297-[国家集训队]单选错位【期望概率】

正题 题目大意 nnn道题&#xff0c;第iii道aia_iai​个选项&#xff0c;选择每个选项的概率第相等的。但是每个选择都会填到后一道题。求对的期望题数。 解题思路 考虑若前面一道题有xxx个选项&#xff0c;后一道有yyy个选项&#xff0c;那么其实就是求一个在1∼x1\sim x1∼x随…

mybatis源码阅读(一):SqlSession和SqlSessionFactory

转载自 mybatis源码阅读(一)&#xff1a;SqlSession和SqlSessionFactory 一、接口定义 听名字就知道这里使用了工厂方法模式&#xff0c;SqlSessionFactory负责创建SqlSession对象。其中开发人员最常用的就是DefaultSqlSession &#xff08;1&#xff09;SqlSession接口定义…

开源纯C#工控网关+组态软件(六)图元组件

一、 图元概述 图元是构成人机界面的基本单元。如一个个的电机、设备、数据显示、仪表盘&#xff0c;都是图元。构建人机界面的过程就是铺排、挪移、定位图元的过程。 图元设计是绘图和编码的结合。因为图元不仅有显示和动画&#xff0c;还有背后操纵动画的控制逻辑。 一个好…

P2590-[ZJOI2008]树的统计【树链剖分,线段树】

正题 题目大意 一棵带权树&#xff0c;要求单点修改&#xff0c;路径求和和路径求最大值。 解题思路 先来一个树链剖分&#xff0c;然后线段树维护。 codecodecode #include<cstdio> #include<algorithm> using namespace std; const int N31000; int tot,cnt,n…

git合并分支的策略(赞)

假设当前有两个分支 master和test&#xff0c;两个分支一模一样&#xff0c;都有这三个文件 现在test添加一个test4.txt&#xff0c;然后提交到本地&#xff08;git add . git commit&#xff09; 切换到master分支上&#xff0c;git checkout master git merge test 这样mase…

mybatis源码阅读(二):mybatis初始化上

转载自 mybatis源码阅读(二)&#xff1a;mybatis初始化上 1.初始化入口 //Mybatis 通过SqlSessionFactory获取SqlSession, 然后才能通过SqlSession与数据库进行交互 private static SqlSessionFactory getSessionFactory() {SqlSessionFactory sessionFactory null;String …

P1983-车站分级【图论,记忆化dfs,构图】

正题 题目链接:https://www.luogu.org/problemnew/show/P1983 题目大意 一个辆车会一个一个值xxx&#xff0c;如果等级大于等于xxx的车站都会停靠(包括起点和终点)。给每辆车的停靠点&#xff0c;求至少要将车站分多少级。 解题思路 对于一辆车&#xff0c;若一个点他经过了…

slot的使用

普通插槽 在嵌入的组件标签中加入内容&#xff0c;如果子组件中有slot就显示&#xff0c;否则就是不显示 父组件 <h1>Hello 父组件</h1> <Child><p>这是一些初始内容</p><p>这是更多的初始内容</p> </Child>子组件 <h1&…

mybatis源码阅读(三):mybatis初始化(下)mapper解析

转载自 mybatis源码阅读(三)&#xff1a;mybatis初始化&#xff08;下&#xff09;mapper解析 MyBatis 的真正强大在于它的映射语句&#xff0c;也是它的魔力所在。由于它的异常强大&#xff0c;映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比…

改造独立部署(SCD)模式下.NET Core应用程序 dotnet的exe文件启动过程

设置一个小目标 改造前 改造后 独立部署SCD模式&#xff0c;是指在使用dotnet publish 命令时带上-r 参数运行时标识符&#xff08;RID&#xff09;。 目标提出原因&#xff1a;SCD模式下文件太乱了&#xff0c;很多文件在开发时大多又涉及不到&#xff0c;发布后如果能把文件…

P1268-树的重量【图论】

正题 题目大意 一棵树有nnn个叶子节点&#xff0c;给出每两个叶子节点之间的距离。求这棵树的边权之和。 解题思路 我们考虑每次加入一个节点。两个节点时不用说。 加入第三个节点时&#xff0c;肯定是加入在节点1和节点2之间。 之后我们开始推导&#xff1a;当我们加入节点…

mybatis源码阅读(四):mapper(dao)实例化

转载自 mybatis源码阅读(四)&#xff1a;mapper(dao)实例化 在开始分析之前&#xff0c;先来了解一下这个模块中的核心组件之间的关系&#xff0c;如图&#xff1a; 1.MapperRegistry&MapperProxyFactory MapperRegistry是Mapper接口及其对应的代理对象工程的注册中心&…

ajax的封装使用

面试的时候有人问到我ajax的使用&#xff0c;当时回答的不算好&#xff0c;这里想重新总结下&#xff1a; 1、如何将配置等信息传到ajax函数里面去 这个采用的是在参数里加一个对象&#xff0c;对象里面放入字段&#xff0c;然后在ajax里设置一个option&#xff0c;通过option…

P3385-[模板]负环【SPFA】

正题 题目大意 求点1可不可以走到负环。 解题思路 用cnticnt_icnti​表示到iii的最短路经过了多少个点&#xff0c;然后求若cnti≥ncnt_i\geq ncnti​≥n且这条路是负数那么就有负环。 codecodecode #include<cstdio> #include<queue> #include<cstring> …

自定义路由匹配和生成

前言 前两篇文章主要总结了CMS系统两个技术点在ASP.NET Core中的应用&#xff1a; 《ASP.NET Core 中的SEO优化&#xff08;1&#xff09;&#xff1a;中间件实现服务端静态化缓存》 《ASP.NET Core 中的SEO优化&#xff08;2&#xff09;&#xff1a;中间件中渲染Razor视图》…

mybatis多个参数(不使用@param注解情况下),sql参数占位符正确写法

转载自 mybatis多个参数(不使用param注解情况下)&#xff0c;sql参数占位符正确写法 useActualParamName配置 useActualParamName允许使用方法签名中的名称作为语句参数名称。 为了使用该特性&#xff0c;你的工程必须采用Java 8编译&#xff0c;并且加上-parameters选项。&…

如何封装并发布一个属于自己的ui组件库

以前就一直有个想法自己能不能封装一个类似于elementui一样的组件库&#xff0c;然后发布到npm上去&#xff0c;毕竟前端说白了&#xff0c;将组件v上去&#xff0c;然后进行数据交互。借助这次端午&#xff0c;终于有机会&#xff0c;尝试自己去封装发布组件库了 我这里了只做…

P1768-天路【负环,SPFA,01分数规划,二分答案】

正题 题目链接:https://www.luogu.org/problemnew/show/P1768 题目大意 求一条回路使得路上∑vi∑pi\frac{\sum v_i}{\sum p_i}∑pi​∑vi​​最大。 解题思路 考虑01分数规划 ∑vi∑pians\frac{\sum v_i}{\sum p_i}ans∑pi​∑vi​​ans ∑vians∗∑pi\sum v_ians*\sum p_i…

听云支持.NET Core的应用性能监控

随着微软于2017年8月正式发布.NET Core 2.0&#xff0c; .NET Core 社区开始活跃&#xff0c;众多.NET开发者开始向跨平台转变。 听云于2017年11月推出了.NET Core应用监控工具&#xff0c;和听云其他语言的监控工具一样&#xff0c;.NET Core应用监控工具具有以下特征&#xf…