`

MongoDB与Java(1) - 建立连接

阅读更多

网上关于MongoDB Java Driver API的知识点都非常零散,自己在使用的过程中,总是遇到很多问题,也是一点点的实验,一点点的查,或者看下源码。在这一系列的博客中,就把自己学到的总结一下,所学较浅,错误难免,希望得到大家的指正。

本系列的文章的源码大部分会使用mongo-java-driver中的单元测试的源代码,里面对每个API的示例都比较详细,大家可以去Git或者网络上搜一搜。

本章讨论以下问题

1. 如何在Java程序中与MongoDB建立连接

2. 如何与副本集建立连接

3. 如何使用连接池

 

1.1 建立连接

在MongoDB Java Driver API中,要操作MongoDB的第一步和使用其他DB Java Driver类似,都需要首先和数据库建立连接。在MongoDBJava Driver API中,建立连接的类为com.mongodb.MongoClient.在讨论连接字符串等内容之前,我们来看看它最简单的使用方式:

 

MongoClient client = new MongoClient();
一个构造函数不带任何参数的版本。使用这个构造函数连接到的是本地的MongoDB服务,即/127.0.0.1:27017,当然你如果改变了MongoDB服务的端口,那么这里显示的端口就是你的端口了。

 

我们可以通过以下单元测试代码进行验证:

 

@Test
public void testConstruactors() throws UnknownHostException {
	MongoClient client;
		
	client = new MongoClient();
	assertEquals(new ServerAddress(), client.getAddress());
	client.close();
}
 目前不需要关心ServerAddress类型,它主要作用于MongoDB服务相关的信息。注意,跟其他DB Java Driver一样,记得关闭连接。
当然,我们也可以指定连接的Host,看下面的单元测试:
client = new MongoClient("127.0.0.1");
assertEquals(new ServerAddress("127.0.0.1"), client.getAddress());
client.close();
 这里,我指定的是本机,你可以使用任何有效的IP.
2.2 设置连接的各项属性
和其他DB Java Driver的连接一样,MongoDB Java Driver的连接也提供了很多属性,我们来了解其中几个。
要设置MongoClient有关连接的属性,我们需要用到com.mongodb.MongoClientOpations类。这个类包含了
MongoClient建立连接时,与连接相关的所有属性。该类提供了一Builder模式的方式创建并设置这些属性的值。
MongoClientOptions customClientOptions = 
new MongoClientOptions.Builder().connectionsPerHost(50).build();
 分析下上面的代码,MongoClientOptions.Builder()得到的是一个MongoClientOptions的Builder,通过该Builder可以设置各种Options,例如connectionsPerHost(50),设置连接池中连接个数,需要注意的是,每个属性的设置方法的返回类型是一个Builder,这意味着我们可以采用类似下面的链式调用:
MongoClientOptions customClientOptions = 
new MongoClientOptions.Builder().connectionsPerHost(50).maxWaitTime(2000).build()
 最后,当我们将需要的各项值设定好后,就调用Builder的builder()方法,得到一个MongoClientOptions对象。
问题来了,上面的代码只是为各项连接相关的属性赋值,那如何将这些值交给MongoClient,让它按照我们给出的属性值来建立连接呢?
答案就是MongoClient的构造函数,看下面的代码:
MongoClientOptions customClientOptions = 
	new MongoClientOptions.Builder()
	.connectionsPerHost(50)
	.maxWaitTime(2000).build();
	MongoOptions options = new MongoOptions(customClientOptions);
	client = new MongoClient("127.0.0.1", customClientOptions);
	assertEquals(new ServerAddress("127.0.0.1"), client.getAddress());
	assertEquals(options, client.getMongoOptions());
client.close();
MongoOptions options = new MongoOptions(customClientOptions);这句代码并不影响MongoClientOptions的使用,只是展示如何获取到我们设置的MongoClientOptions,另外,我们也可以直接通过MongoClient.getMongoOptions()获取到MongoOptions后,进行设置,而不使用MongoClientOptions,如下:
MongoOptions mps = mongoClient.getMongoOptions();
mps.setConnectionsPerHost(mongoDBConfig.getPoolSize());
mps.setConnectTimeout(mongoDBConfig.getConnectTimeout());
mps.setMaxWaitTime(mongoDBConfig.getMaxWaitTime());
 不过我推荐MongoClientOptions,代码更加优雅。另外,即使我们没有设置MongoClientOptions,MongoClient也会有默认的设置,大家可以自己把他们打印出来看看。
 
1.3 使用连接字符串进行连接
上面的连接只是指定了连接到MongoDB的服务,但是具体连接到哪个数据库呢?使用什么样的登录名和密码呢?这个时候就用到连接字符串了,我们先解释下MongoDB的连接字符串,如下:
mongodb://user1:pwd@127.0.0.1/test?authMechanism=MONGODB-CR&maxPoolSize=500
 上面的连接字符串模式如下:
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

大家可以看到,大部分内容是可选的,也就是说,最简单的连接字符串就是

mongodb://127.0.0.1

当然,真正在项目中,没人会这么用。

我们发现了一个有趣的地方,就是可以提供多个host和port.这是因为,我们使用MongoDB,会以集群的方式使用,  集群中一台主服务,多个从服务,这个时候,我们就要在连接字符串中列出来,例如:

mongodb://host1,host2,host3/?connect=direct;slaveOk=true

MongoDB的连接字符串就简单介绍到这里,不了解的童鞋可以去http://www.w3cschool.cc/mongodb/mongodb-connections.html看看。

回到主题,在MongoClient中,如何使用连接字符串进行连接呢?MongoDB Java Driver提供了一个com.mongodb.MongoClientURI类型,使用方式如下:

 

client = new MongoClient(
	new MongoClientURI(
		"mongodb://kwiner:test123@127.0.0.1/test?authMechanism=MONGODB-CR&maxPoolSize=500"));
client.close();

 

1.4 Mongo和MongoClient的关系

MongoClient继承自Mongo,使用Mongo也可建立连接,但是需要使用与Mongo适应的MongoOptions,MongoURI等类型。

 

1.5 安全连接

MongoClient也提供了使用用户名和密码连接到指定数据库的方式,需要用到com.mongodb.MongoCredential,该类在mongo-java-driver的2.11.0版本中才开始提供,请大家注意。

 

 MongoClientOptions clientOptions = 
	new MongoClientOptions.Builder()
	.connectionsPerHost(50)
	.maxWaitTime(2000).build();
List<MongoCredential> lstCredentials = 
        Arrays.asList(MongoCredential.createMongoCRCredential(
        	"admin", "myinfo", "123456".toCharArray()));
client = new MongoClient(new ServerAddress("127.0.0.1"),lstCredentials, clientOptions);
client.close();
 首先注意List<MongoCredential> lstCredentials = 
 Arrays.asList(MongoCredential.createMongoCRCredential("admin", "myinfo", "123456".toCharArray()));这一句代码,使用了MongoCredential的静态方法createMongoCRCredential创建MongoCredential,createMongoCRCredential会创建使用通用安全服务应用程序接口来完全的访问MongoDB.另外,因为MongoClient要求一个List<MongoCredential> ,所以我们这里使用了Arrays.asList。使用createMongoCRCredential创建MongoCredential,需要提供username,database和password.
1.6 连接池
MongoClient本身就使用了连接池,如果我们使用了MongoClientOptions,则默认是100个连接
MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
MongoClientOptions options = builder.build();
assertEquals(100, options.getConnectionsPerHost());//最大连接数
assertEquals(0, options.getMinConnectionsPerHost());//最小连接数
assertEquals(0, options.getMaxConnectionIdleTime());//连接的最大闲置时间
assertEquals(0, options.getMaxConnectionLifeTime());//连接的最大生存时间
assertEquals(120000, options.getMaxWaitTime());//最大等待可用连接的时间
assertEquals(10000, options.getConnectTimeout());//连接超时时间

MongoClient client = new MongoClient("127.0.0.1", customClientOptions);
client.close();
 其中闲置时间和生存时间为0,表示无限制。
最后,MongoClient的close方法会关闭底层连接,MongoClient的实例将变得不可用,我们应该根据程序的需要,适当的调用该方法,释放资源。

 1.7 连接副本集

使用MongoDB作为数据库,基本上都会使用副本集,在这个集里面,有primary节点,又有其他secondary节点,并使用了读写分离,这个时候,使用java连接MongoDB服务应该怎么做呢? 其实很简单,就是使用一个ServerAddress集合保存副本集中的所有节点,然后作为MongoClient的构造函数的参数,并使用ReadPreference设置读写策略,注意,ReadPreference的读写策略既可以在MongoClient上设置,作用与使用MongoClient连接的所有操作,也可以设置到每次具体的集合操作上,作用域该次操作。代码如下:

在MongoClient上设置读写策略:

 

List<ServerAddress> addresses = new ArrayList<ServerAddress>();
ServerAddress address1 = new ServerAddress("192.168.1.136" , 27017);
ServerAddress address2 = new ServerAddress("192.168.1.137" , 27017);
ServerAddress address3 = new ServerAddress("192.168.1.138" , 27017);
addresses.add(address1);
addresses.add(address2);
addresses.add(address3);

mongoClient = new MongoClient(lstAddrs);
mongoClient.setReadPreference(ReadPreference.primary());
某次操作上设置读写策略

 

 

List<ServerAddress> addresses = new ArrayList<ServerAddress>();
ServerAddress address1 = new ServerAddress("192.168.1.136" , 27017);
ServerAddress address2 = new ServerAddress("192.168.1.137" , 27017);
ServerAddress address3 = new ServerAddress("192.168.1.138" , 27017);
addresses.add(address1);
addresses.add(address2);
addresses.add(address3);
 
MongoClient client = new MongoClient(addresses);
DB db = client.getDB( "test" );
DBCollection coll = db.getCollection( "test" );
 
BasicDBObject object = new BasicDBObject();
object.append( "test2" , "testval2" );
 
//读操作从副本节点读取
ReadPreference preference = ReadPreference. secondary();
DBObject dbObject = coll.findOne(object, null , preference);
System. out .println(dbObject);
 

 

注意注释处的代码。

 

连接操作就讲到这里,我们并没有将连接的所有API都讲到,只是希望在这里起个抛砖引玉的作用。谢谢大家!

 

 

 

分享到:
评论

相关推荐

    深入云计算 MongoDB管理与开发实战详解pdf.part1

    3.5 客户端请求和MongoDB数据库连接 3.6 本章小结 第2篇 应用篇 第4章 查询 4.1 find简介 4.1.1 返回指定的键 4.1.2 find查询限制 4.2 条件操作符 4.2.1 $all匹配所有 4.2.2 $exists判断字段...

    mongoDB详细学习资料.docx

    MongoDB 最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现...基本命令,增删改查,高级查询,Java连接MongoDB,MongoDB连接池,综合案例-网站点击日志分析,日志写入与查询

    MongoDB系列教程(六):java操作mongodb实例

    java操作mysql数据库的代码我们已经了如指掌了,增删改查,java对mongodb数据库也是类似的操作,先是数据库连接,再是进行操作。 首先我们进入进入admin数据库,然后建立自己的数据库testMongoDb,进入admin数据库后...

    MongoDB权威指南(中文版)高清

    423.5 请求和连接 43第4章 查询 454.1 find简介 454.1.1 指定返回的键 464.1.2 限制 464.2 查询条件 474.2.1 查询条件 474.2.2 OR查询 474.2.3 $not 484.2.4 条件句的规则 494.3 特定于类型的...

    电子书:MongoDB权威指南(中文版)

    263.3.2 使用修改器 273.3.3 Upsert 363.3.4 更新多个文档 383.3.5 返回已更新的文档 383.4 瞬间完成 413.4.1 安全操作 413.4.2 捕获“常规”错误 423.5 请求和连接 43第4 章 查询 454.1 find ...

    MUG-Nantes-Demo-Hadoop:适用于HadoopMongoDB连接器演示

    MongoDB Hadoop演示连接器 幻灯片: : 步骤0-建立 Java cd spark/java mvn clean package assembly:single 第1步-导入数据 清洁(蒙古壳) use marketdata db.stock_prices.drop () 资料来源:cf。 进口 mongo...

    深入云计算 MongoDB管理与开发实战详解pdf.part2

    3.5 客户端请求和MongoDB数据库连接 3.6 本章小结 第2篇 应用篇 第4章 查询 4.1 find简介 4.1.1 返回指定的键 4.1.2 find查询限制 4.2 条件操作符 4.2.1 $all匹配所有 4.2.2 $exists判断字段...

    mongodb测试demo

    1 建立一个Mongo的数据库连接对象 Mongo mg new Mongo &quot;127 0 0 1:27017&quot; ; 查询所有的Database for String name : mg getDatabaseNames { System out println &quot;dbName: &quot; + name ; }

    VGit:用Java编写的简单git服务器

    下载并安装Java开发工具包11的最后一个版本与NPM。 适用于Mac的Java- 适用于Linux的Java- 使用以下命令构建VGit的完整发行版: ./gradlew fullBuild 编译后的发行版位于backend/build/libs文件夹中 安装mongodb...

    SpringBoot 在线协同办公小程序开发 全栈式项目实战

    )建立ssh连接-emos小程序 创建SpringBoot项目–EMOS小程序配置MyBatis - EMOS小程序 创建SpringBoot项目-emos小程序配置mybati-emos小程序 创建自定义异常类–EMOS小程序封装Web返回对象–EMOS小程序利用Swagger...

    http_log:将HTTP请求记录到MongoDB进行调试并通过Web访问它们

    一旦安装了gem,请运行mongoid配置生成器以建立连接。 gem 'http_log'bundle installbundle exec rails g mongoid:config # if you don't already have one记录内容的示例{ "_id" : "4f16c6c4340765d7c5000005" , ...

    mongoConnect:使用Mongo Java驱动程序将Java域对象连接到Mongo文档

    该项目旨在成为使用Java的mongoDB的简单方法,它使用轻量级且清晰的类。 您将能够使用POJO将域对象映射到Mongo文档(DBObjects)。 如何 克隆此项目。 $ cd ~ $ git clone ...

    spring-mvc-maven-mongodb:Spring MVC(使用Maven构建),带有用于Platform.sh的MongoDB模板

    它包括一个MongoDB数据库,示例应用程序显示了如何建立数据库连接。 该示例代码还演示了如何使用Platform.sh Config Reader库访问Platform.sh环境变量。特征Java 11 MongoDB 3.6 自动TLS证书基于Maven的构建客制化...

    moodFood:最低可行的产品,允许用户发现适合自己心情的新餐厅。 moodFood建立在MERN堆栈(MongoDB,Express,React和Node.js)上:stuffed_flatbread::falafel:

    背景和概述 MoodFood是最低可行的产品,它使用户可以找到适合... moodFood从MongoDB和Google APIs中提取信息,以显示与用户情绪相匹配的餐厅。 对于Hangry和Adventurous情绪,用户不会自行决定选择Hangry食物。 对于Ha

    MBank-Project-Core

    ##服务器逻辑将建立在 Java 和 Java 框架之上。 首先,Java 核心项目将使用 Apache Derby DB。 将有一个数据库连接层、数据库管理器和操作。 还将有用于 mbank 桌面应用程序的 Swing 包。 第二,动态 Web 项目 - ...

    sustain-query-service

    gRPC服务器使用MongoClient实例建立与mongo实例的连接,在分片群集的情况下,它可以作为mongos路由器运行;在分片副本集的情况下,则可以作为mongod实例运行。 连接配置是在编译时从src/main/java/resources/config...

    python网络编程DAY01.txt

    会话层 : 建立应用级的连接,选择传输服务 传输层 : 提供不同的传输服务。流量控制 网络层 : 路由选择,网络互连 链路层 : 进行数据转换,具体消息的发送,链路连接 物理层 : 物理硬件,接口设定,网卡路由...

    cloudfoundry-service-broker:Spring Cloud的示例项目-Cloud Foundry Service Broker

    入门您需要在某处安装和运行MongoDB并在配置连接性。 建立它: ./gradlew build 构建完成后,您可以将代理应用程序推送到Cloud Foundry或以其他方式部署它,然后 。在您的MongoDB实例中启用身份验证添加初始管理员...

    spring-boot-hello-cfbroker

    Spring Boot CF服务经纪人蒙古使用示例Spring Boot项目概述这... 您需要在某个地方安装MongoDB并在配置连接。 建立它: ./gradlew build这就对了。 您可以将代理推送到CF或以其他方式部署它,然后像往常一样注册它: 。

    boteco:在JBoss Fuse之上构建的多平台bot

    Boteco 如果您可以编写一个可以在每个... db.url :连接到mongodb实例的mongodb url db.database :用于检索集合的mongodb数据库在JBoss Fuse中运行这比摔倒自行车容易! 在Fuse控制台中,执行以下命令( $VERSION是

Global site tag (gtag.js) - Google Analytics