`
eric_hwp
  • 浏览: 126699 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MongoDB Java Driver中的写操作策略

 
阅读更多

【转】https://github.com/xbwen/xbwen.github.io/wiki/MongoDB-Java-Driver%E4%B8%AD%E7%9A%84%E5%86%99%E6%93%8D%E4%BD%9C%E7%AD%96%E7%95%A5
1、WriteConcern

当Java程序往MongoDB中写数据的时候,可以通过设置WriteConcern参数,来控制写操作策略。

WriteConcern是MongoDB Java Driver提供的一个类,它提供了若干常量,其中最常用的2个如下:

ACKNOWLEDGED——Java Driver会等待MongoDB Server确认写操作完成。

UNACKNOWLEDGED——Java Driver把写操作请求发往MongoDB Server,然后立刻返回,不管MongoDB Server是否执行了该写操作。

显然,通过ACKNOWLEDGED能知道写操作是否成功,但执行写入操作会比较耗时;UNACKNOWLEDGED写入速度会非常快,但无法知道写入是否成功。

2、全局默认配置

接下来,我们结合BuguMongo中的代码,看看WriteConcern在实际中是如何使用的。

MongoDB Java Driver默认使用ACKNOWLEDGED,这个默认值是在MongoClientOptions中定义的:

public class MongoClientOptions {
    …
    private WriteConcern writeConcern = WriteConcern.ACKNOWLEDGED;
    …
}

也就是说,MongoDB Java Driver默认所有的写操作都是需要确认再返回的。如果你要改变这个全局的配置,可以在建立BuguConnection连接的时候,赋值一个自定义的MongoClientOptions。例如:

MongoClientOptions myOptions = MongoClientOptions.builder().writeConcern(WriteConcern.UNACKNOWLEDGED).build();
BuguConnection conn = BuguConnection.getInstance();
conn.setOptions(myOptions);
conn.connect("192.168.0.100", 27017, "mydb", "username", "password");

3、BuguDao中的WriteConcern

然而,在一个项目中,使用同一个写入策略,是不太现实的。我们往往需要经常变换写入策略。别担心,BuguDao提供了setWriteConcern()方法,你可以针对不同的Collection设定不同的写入策略,而且可以随时改变。

如果不进行设置的话,BuguDao默认使用的是ACKNOWLEDGED。

我们可以进行一个比较实验,分别使用ACKNOWLEDGED和UNACKNOWLEDGED,往MongoDB中写入1万条数据,看看耗时相差多少。

@Entity
public class Foo extends SimpleEntity {

    private String content;

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

}

实验1:

BuguDao dao = new BuguDao(Foo.class);
long begin = System.currentTimeMillis();
for(int i=0; i<10000; i++){
    Foo foo = new Foo();
    foo.setContent("abcdefg" + i);
    dao.save(foo);
}
long end = System.currentTimeMillis();
System.out.println(end - begin);

这里,我们不对WriteConcern进行设置,而是使用默认的ACKNOWLEDGED。代码执行3次,在我的笔记本电脑上,输出的结果分别是:

55007, 55503, 54066

实验2:

BuguDao dao = new BuguDao(Foo.class);
//设置WriteConcern为UNACKNOWLEDGED,而不是默认的ACKNOWLEDGED
dao.setWriteConcern(WriteConcern.UNACKNOWLEDGED);  
long begin = System.currentTimeMillis();
for(int i=0; i<10000; i++){
    Foo foo = new Foo();
    foo.setContent("abcdefg" + i);
    dao.save(foo);
}
long end = System.currentTimeMillis();
System.out.println(end - begin);

代码执行3次,在我的笔记本电脑上,输出的结果分别是:

1736, 2636, 1470

可以看出,写入的速度快了很多。

4、写操作的返回值

上面的实验中,我们忽略了dao.save(foo)的返回值。实际上,BuguDao中的所有写操作,返回值都是WriteResult,而不是void。例如:

public WriteResult save(T t)

如果你使用的WriteConcern是UNACKNOWLEDGED,那么WriteResult是没有任何用处的。但如果你使用的是ACKNOWLEDGED,那么可以从WriteResult中获得写操作的结果,例如:操作是否成功,总共写了多少条数据,等等。

分享到:
评论

相关推荐

    MongoDB Driver -JAVA 2.5.3 API

    MongoDB Driver for Java 2.5.3是官方提供的用于Java开发者与MongoDB数据库交互的API。这个API允许程序员高效地执行各种操作,包括插入、查询、更新和删除MongoDB中的数据。MongoDB是一个高性能、无模式的文档型...

    mongodb-java-driver源码依赖库

    当从远程Maven仓库下载`mongodb-java-driver`的源码依赖时,可能会遇到证书错误,这可能是由于网络问题、过期的SSL证书或者安全策略设置导致的。为了避免这类问题,将依赖库下载到本地`.m2`目录可以确保在后续的开发...

    mongodb-java驱动,内含3个jar包和一个JAVA测试类

    在本压缩包中,包含了三个核心的jar包以及一个名为`MongoDBJDBC.java`的Java测试类,这将帮助我们了解如何使用这些驱动进行数据库操作。 1. **mongodb-driver-core-3.0.1.jar**:这是MongoDB Java驱动的核心组件,...

    jdbc java mongodb mysql 相互同步

    对于MongoDB,Java也提供了一个驱动叫做MongoDB Java Driver,它允许我们通过JDBC的类似方式操作NoSQL数据库。引入依赖后,我们可以创建MongoClient并连接到MongoDB数据库: ```java MongoClient mongoClient = new...

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

    在这个场景中,我们关注的是一个Java客户端,它被设计用于并发访问MongoDB数据库并进行性能测试。这个客户端涵盖了三个主要操作:查询、修改和插入,这些都是数据库操作中的基本且重要的功能。 首先,让我们深入...

    mongodb驱动源码

    在本篇文章中,我们将深入探讨`mongodb-mongo-java-driver-17a6ba6`这个版本的MongoDB Java驱动源码,以了解其内部工作原理和设计模式。 1. **连接管理**:MongoDB Java驱动通过`MongoClient`类建立与MongoDB服务器...

    Mongodb连接池JAVA

    在Java中,我们可以使用如JDBC(Java Database Connectivity)对SQL数据库进行连接池管理,但MongoDB并不支持JDBC。相反,我们需要使用专门的驱动程序,如`mongo-java-driver`,这个驱动程序包含了连接池管理的功能...

    mongo-java-driver-3.5.0.jar版本驱动包

    而`mongo-java-driver`则是MongoDB官方提供的Java语言接口,使得开发者能够方便地在Java环境中操作MongoDB。 在3.5.0版本中,这个驱动程序包含了以下主要功能和特性: 1. **BSON库集成**:BSON(Binary JSON)是...

    java+mongodb+分页

    在Java中,我们通常使用MongoDB Java驱动程序(也称为Java MongoDB Driver)来与MongoDB进行交互。 分页查询是任何Web应用程序或数据密集型系统的重要功能,用于限制一次性返回的数据量,提高用户体验并减轻服务器...

    java面试——MongoDB面试专题.zip

    在面试中,除了技术知识,还会考察你对项目中实际应用MongoDB的经验,包括遇到的问题、解决策略以及如何与其他技术(如Java、Spring框架)集成。对这些知识点的深入理解和实践经历,将有助于你在面试中脱颖而出。

    Java与log4j2整合mongoDB需要的jar包

    - `mongodb-driver.jar`:MongoDB Java驱动,用于连接和操作MongoDB数据库。 - `mongodb-driver-sync.jar`:同步版本的MongoDB驱动,适用于Java应用程序。 2. **配置log4j2**:在你的项目中创建一个log4j2的配置...

    Pure JS (4.3): pure.db.js 的实现(基于 MongoDB Rhino Driver)

    Rhino Driver是MongoDB官方提供的用于Java平台的驱动,通过它,开发者可以直接在Java应用中使用MongoDB。 pure.db.js的核心理念是通过Rhino将JavaScript与MongoDB的Java驱动连接起来,提供一套纯JavaScript的接口供...

    mogodb.rar_3OL_mongodbdriver

    在这个特定的压缩包 "mogodb.rar_3OL_mongodbdriver" 中,可能包含了针对3OL平台或者某种特定编程语言的MongoDB驱动实现,例如Java、Python、Node.js等。文件名 "201577F0624李玉婷" 看似不直接与MongoDB驱动相关,...

    MongoDB权威指南.pdf

    在Java中操作MongoDB,通常会使用一个名为“MongoDB Java Driver”的客户端库。通过这个驱动程序,开发者可以执行CRUD(创建、读取、更新、删除)操作,以及其他高级操作,如索引、聚合和映射等。MongoDB Java ...

    mongoDB实现BOM表多试图转换

    Java作为广泛使用的开发语言,拥有丰富的MongoDB驱动程序,如MongoDB Java Driver,使得我们可以方便地操作MongoDB数据库。利用这些驱动,我们可以编写Java代码来读取BOM数据,执行转换逻辑,然后更新或插入新的视图...

    MongoDB集群以及日志、异常规范Java代码实例.zip

    在Java中使用MongoDB,通常依赖`mongodb-driver-sync`或`mongodb-driver-reactivestreams`库。以下是一些关键概念: 1. MongoClient:作为与MongoDB服务器的连接,可创建多个MongoClients以连接不同服务器或复制集。...

    Mongodb in Mycat指南

    其中,`name`属性用于唯一标识该连接配置,`maxCon`和`minCon`分别定义了连接池的最大和最小连接数,`balance`和`writeType`用于控制写操作的负载均衡策略。 - **配置表** 在`&lt;schema&gt;`节点中为MongoDB表指定配置...

    收集的mongodb开发学习资料

    11. **MongoDB驱动程序**:MongoDB有多种编程语言的驱动程序,如Python的PyMongo、Java的MongoDB Java Driver等,学习如何在不同语言中与MongoDB进行交互是开发中的关键。 12. **最佳实践**:包括数据模型优化、...

    mongodb jar包

    在Java开发环境中,与MongoDB进行交互通常会使用`mongo-java-driver`,这是一个官方提供的Java驱动程序。`mongo-java-driver-3.6.3`是驱动的特定版本,这个版本增加了对MongoDB服务器3.6版本的兼容性和优化。例如,...

    solr-mongo-import-1.0和1.1以及mongo-Java-driver

    它通过Java API封装了MongoDB的协议,使得开发者可以方便地在Java代码中操作MongoDB。 集成Solr和MongoDB的过程通常包括以下步骤: 1. **配置Solr**: 首先,你需要在Solr中创建一个核心(collection),定义好字段...

Global site tag (gtag.js) - Google Analytics