`
BigCat2013
  • 浏览: 53083 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

MongoDB 在多线程高并发下的问题

阅读更多

最近项目用到 MongoDB , 主要是一些读取数据及改状态位的操作. 因为是结合了最近流行的 Storm进行大数据的分析处理,并将分析结果插入Vertica数据库,所以在多线程高并发的情境下, 会发现 Vertica 数据库中有部分重复的数据. 这到底是什么原因导致的呢?笔者开始也是一筹莫 展,重复去看 MongoDB 的 API , 终于有了新发现 :

com.mongodb.DB 这个类有三个很重要的方法 :

 

public abstract void requestStart() :
starts a new "consistent request". Following this call and until requestDone() is called, all db operations should use the same underlying connection. This is useful to ensure that operations happen in a certain order with predictable results.
public abstract void requestDone():
ends the current "consistent request"

public abstract void requestEnsureConnection():
ensure that a connection is assigned to the current "consistent request" (from primary pool, if connected to a replica set) 




具体再查了 MongoDB相关的文档才发现, mongodb 的java driver是不支持是事务性的,所以如果想保证在多线程高并发的情境下不出错(指定的一批数据在同一个底层的数据连接中完成),就必须在使用DB的时候加上上述三个方法。

按照 API 提供的方法说明,在项目代码获得DB的后面加上db.requestStart(),db.requestEnsureConnection(),然后在执行完数据库操作之后加上db.requestDone(),成功解决了数据重复的问题!

 

原创文章,转载请注明出处:

http://bigcat2013.iteye.com/blog/2109233

 

谢谢!

1
0
分享到:
评论
4 楼 你好嘚吧嘚 2019-04-25  
liubey 写道
NOSQL没有事务 常识性姿势

现在是2019年4月25日15:09:56,redis支持事物,mongodb的4.0+也支持了事物
3 楼 liubey 2014-08-27  
NOSQL没有事务 常识性姿势
2 楼 BigCat2013 2014-08-27  
其实这一系列操作无非就是在底层连接上加了线程锁,既然涉及到锁这个动作,自然就是影响了性能,但这个影响在 mongoDB 中很难体现,因为mongoDB Pool中的DB基本上是不会同时用完的,也就是说,一般情况下当你需要数据操作时,连接池中总可以拿出可用的DB给你使用(当你New 一个Mongo(或者MongoClient)是,其实就是创建了一个连接池,你可以从这个连接池中拿DB(Mongo默认最多是10个,MongoClient是100个),而且DB不需要你去关闭,当你执行完数据库操作时,会自动回收到连接池中待用)。
1 楼 sunwt 2014-08-27  
不知道这样对mongoDB的写性能是得到了提升还是减慢了呢?

相关推荐

    基于MongoDb的分布式高并发日志系统的设计.pdf

    在高并发的系统中,通过多线程可以显著提升程序的处理能力。 6. 非关系型数据库MongoDB:MongoDB是一个面向文档的NoSQL数据库,它支持高性能、高可用性和易扩展性。MongoDB中的分片技术能够将数据分布到多个服务器...

    PHP mongodb扩展线程安全64位

    线程安全是多线程编程中的一个关键概念,意味着在多线程环境下,该扩展可以在不引入竞态条件或数据不一致性的情况下正确运行。PHP的线程安全特性对于那些在高并发服务器环境中运行的应用尤其重要,因为它确保了不同...

    Mongodb的并发访问性能测试的java客户端

    在多线程环境中,Java提供了丰富的API来支持并发,如`java.util.concurrent`包下的`ExecutorService`、`Thread`和`Semaphore`等工具,可以有效地管理和控制并发任务的执行。 MongoDB Java驱动程序是连接Java应用...

    SpringMVC+mongodb应用实例

    在多线程环境下,数据一致性、锁的使用以及事务管理成为关键问题。MongoDB虽然不支持传统的关系型数据库ACID(原子性、一致性、隔离性、持久性)特性,但它提供了单文档的原子性操作,这对于大部分应用场景已经足够...

    前端 Vue+Node+MongoDB高级全栈开发

    1. **事件驱动**:Node.js 使用事件机制来处理 I/O 操作,这使得它可以轻松处理高并发连接。 2. **单线程**:Node.js 应用程序是单线程的,但是可以通过非阻塞 I/O 调用来异步执行任务。 3. **NPM(Node Package ...

    MongoDB性能调优(基于MMS)

    在多线程和并发环境下,锁是保证数据一致性的重要机制,但是过多的锁竞争和锁等待会导致性能的显著下降。队列长度则通常用于衡量任务等待处理的时间和数量,一个不断增长的队列长度可能预示着后端处理能力不足或存在...

    MongoDB介绍

    3. **弹性伸缩**:MongoDB通过分片(Sharding)技术实现水平扩展,可以在集群中分配数据,以支持大数据量和高并发访问。当数据量增加时,可以通过添加更多的服务器来扩展存储和处理能力。 4. **高性能**:MongoDB...

    mongodb的开发和nio实现

    在使用NIO时,需要注意线程安全问题,因为NIO的Selector是多线程环境下共享的资源。此外,对于缓冲区的管理,要确保正确地清空和填充,避免数据丢失或混乱。在处理大文件时,可以利用NIO的文件通道进行零拷贝操作,...

    mongoDB说明文档

    这部分内容进一步探讨了锁定在MongoDB中的具体实现和使用场景,帮助开发者在多线程环境中正确地使用MongoDB。 ### **33. MongoDB数据库管理(Mongo Database Administration)** 数据库管理是MongoDB运维的核心工作...

    BigCore大数据高并发开发框架

    提供的"java.zip"文件可能包含了该框架的核心Java代码,这表明BigCore可能是用Java语言实现的,Java以其跨平台性和强大的多线程处理能力,是构建高并发系统理想的编程语言。开发人员可以借助这些源代码理解框架的...

    MongoDBjava驱动源码程序

    1. **线程安全**:驱动是如何确保在多线程环境下正确工作的。 2. **性能优化**:如批处理操作、缓存策略等。 3. **错误处理和恢复**:如何优雅地处理网络中断、服务器错误等问题。 4. **新版本特性**:随着MongoDB...

    MongoDB 开发文档

    - 主要特性:易于Ruby环境集成、支持多线程操作、提供全面的数据库管理API。 6. **Scala MongoDB 驱动程序** - 版本:未具体说明 - 描述:针对Scala语言优化的驱动程序。 - 功能特性:兼容Scala语法、支持并发...

    亲测可用基于 SpringBoot+Maven+Mybatis+Redis+RabbitMQ 高并发秒杀系统

    基于 SpringBoot+Maven+Mybatis+Redis+RabbitMQ 高并发商城秒杀系统; 开发工具IntelliJ IDEA 2017.3.1 x64; 项目搭建: 1、下载代码 将项目加载到IDEA里面 2、运行sql文件夹下的sql文件 3、到src/main/resources下...

    mongodb-async-driver-2.0.1 jar包

    8. **GridFS**:支持MongoDB的文件存储系统GridFS,用于存储和检索大文件,将文件拆分为多个块存储在MongoDB中。 9. **聚合框架**:提供了强大的聚合功能,允许用户在客户端进行复杂的数据分析,而无需将数据拉取到...

    45_说说一般如何设计一个高并发的系统架构?.zip

    在高并发场景下,单一服务器往往难以应对,因此需要引入负载均衡技术。常见的负载均衡器有Nginx、HAProxy等,它们可以将用户请求分发到多个服务器,从而分散压力,提高系统整体处理能力。负载均衡策略包括轮询、最少...

    MongoDB-C++-Driver3.2.rar

    在性能方面,MongoDB-C++-Driver3.2利用了异步I/O模型,提高了多线程应用的并发性能。驱动中的`Future`和`Promise`类可以帮助开发者编写非阻塞的代码,提高应用程序的响应速度。 安全方面,MongoDB-C++-Driver支持...

    mac版 mongodb-osx-ssl-x86_64-3.0.15.tgz

    4. **分布式数据库**:MongoDB的分片功能允许你将数据分布在多个服务器上,以处理更大的数据量和更高的并发请求。 5. **SSL支持**:"mongodb-osx-ssl-x86_64-3.0.15" 版本包含SSL支持,这意味着在MongoDB实例之间...

    高并发高流量网站架构

    在高并发高流量的场景下,数据库的选择至关重要。传统的关系型数据库虽然提供了强大的事务处理能力,但在面对海量数据和高并发访问时可能会遇到性能瓶颈。因此,很多高流量网站会选择NoSQL数据库或者分布式数据库...

    计算机软件-商业源码-265 数据库与多线程.zip

    在这个“265 数据库与多线程”压缩包中,可能包含的子文件可能是用不同编程语言(如Java、C#或Python)编写的源码示例,演示如何在多线程环境下操作数据库。这些示例可能涵盖了连接数据库、执行查询、处理结果集、...

    面试题库(Python+Vue+MongoDB).zip

    1. **Python** 部分:可能包括Python的基础语法、面向对象编程、常用库(如Numpy、Pandas、Django、Flask等)、错误和异常处理、多线程与并发、网络编程以及Python在实际项目中的应用等。 2. **Vue.js** 部分:涵盖...

Global site tag (gtag.js) - Google Analytics