文档章节

MongoDB的连接池和连接管理

今天来找bug
 今天来找bug
发布于 2016/07/13 16:37
字数 876
阅读 456
收藏 1

在关系型数据库中,我们总是需要关闭使用的数据库连接,不然大量的创建连接会导致资源的浪费甚至于数据库宕机。这篇文章主要想解释一下mongoDB的连接池以及连接管理机制,如果正对此有疑惑的朋友可以看一下。

通常我们习惯于new 一个connection并且通常在finally语句中调用connection的close()方法将其关闭。正巧,mongoDB中当我们new一个Mongo的时候,会发现它也有一个close()方法。所以会出现这样的情况:我们在需要DB操作的方法中new一个mongo实例,然后调用mongo.getDB()方法拿到对应的连接,操作完数据之后再调用mongo.close()方法来关闭连接。 看起来貌似是没有什么问题,但是如果你再研究一下mongo的API,你会发现这样耳朵操作就相当于园丁在浇花的时候去打了一桶水,然后舀了一勺水浇一朵花,然后他把一桶水全倒了回去,重新打一桶水,再舀了一勺水浇另外一朵花。。。

说到这里大家应该都已经明白了,其实当你new Mongo()的时候,就创建了一个连接池,getDB()只是从这个连接池中拿一个可用的连接。而连接池是不需要我们及时关闭的,我们可以在程序的生命周期中维护一个这样的单例,至于从连接池中拿出的连接,我们需要关闭吗?答案是NO。你会发现DB根本没有close()之类的方法。在mongoDB中,一个连接池会维持一定数目的连接,当你需要的时候调用getDB()去连接池中拿到连接,而mongo会在这个DB执行完数据操作时候自动收回连接到连接池中待用。所以在mongoDB中大家不必担心连接没有关闭的问题,在你需要在所有操作结束或者整个程序shutdown的时候调用mongo的close()方法即可。

以下的官网的一些解释:

public Class Mongo:

A database connection with internal connection pooling. For most applications, you should have one Mongo instance for the entire JVM.

public Class MongoClient:

A MongoDB client with internal connection pooling. For most applications, you should have one MongoClient instance for the entire JVM.

Note: This class supersedes the Mongo class. While it extends Mongo, it differs from it in that the default write concern is to wait for acknowledgment from the server of all write operations. In addition, its constructors accept instances of MongoClientOptions and MongoClientURI, which both also set the same default write concern.

In general, users of this class will pick up all of the default options specified in MongoClientOptions. In particular, note that the default value of the connectionsPerHost option has been increased to 100 from the old default value of 10 used by the superceded Mongo class.

 

Mongo 是一个过期的类,取而代之的是MongoClient, 值得一提的是MongoClient把connection的默认值从以前的10个变成了现在的100个,省去了自定义配置的繁琐,很贴心。

 

下面是我写的一个MongoConnectionFactory:

 

 

Java代码

 收藏代码

  1. <strong>public class MongoConnFactory {  
  2.   
  3.     private static MongoClient mongoClient = null;  
  4.   
  5.     @SuppressWarnings("deprecation")  
  6.     public static  DB getDB() throws UnknownHostException {  
  7.           
  8.          DB conn = null;  
  9.          if(mongoClient == null){  
  10.              intializeMongoClient();  
  11.                   
  12.         }  
  13.          String dbName = AppConfig.getValue(Const.MONGODB_DBNAME);  
  14.          String username = AppConfig.getValue(Const.MONGODB_USERNAME);  
  15.          String password = AppConfig.getValue(Const.MONGODB_PASSWORD);  
  16.          conn = mongoClient.getDB(dbName);  
  17.          conn.authenticate(username, password.toCharArray());  
  18.          return conn;  
  19.               
  20.           
  21.     }  
  22.   
  23.        private static void intializeMongoClient() throws UnknownHostException {  
  24.           
  25.            String host = AppConfig.getValue(Const.MONGODB_HOST);  
  26.            int port = AppConfig.getValueAsInteger(Const.MONGODB_PORT);  
  27.            mongoClient = new MongoClient( host , port );  
  28.           
  29.     }  
  30.   
  31.     public  static synchronized void closeConnection(){  
  32.           
  33.             if(mongoClient != null){  
  34.                   
  35.                 mongoClient.close();  
  36.                   
  37.             }  
  38.     }  
  39.           
  40.     }</strong>  

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

 

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

本文转载自:http://bigcat2013.iteye.com/blog/2109633?utm_source=tuicool&utm_medium=referral

共有 人打赏支持
今天来找bug
粉丝 9
博文 214
码字总数 36040
作品 0
深圳
程序员
私信 提问
PHP-FPM模式下可怕的 MongoDB-PHP-Driver 连接池无节制连接问题

@郑昀汇总 创建日期:2013/1 问题发生环境: Nginx PHP 5.3.10 as php-fpm extension to nginx mongodb-php-driver 1.2.12 MongoDB 2.2 此问题是 MongoDB PHP Driver 1.2.x 的官方特性导致的......

旁观者-郑昀
2013/02/08
0
0
8 个不得不用的开源 MongoDB 驱动

上至企业级产品,下到跨平台的小型库,我们总共搜集了超过一百万个开源产品和几乎所有开源库信息,从中挑出了几个你们最需要的开源产品。 1、MangoDB CSharp Driver MongoDB C# Driver 是一个...

oschina
2015/07/04
10.4K
8
spring-boot-starter-mongodb-pool

在日常工作中,我们通过Spring Data Mongodb来操作Mongodb数据库,在Spring Boot中只需要引入spring-boot-starter-data-mongodb即可。 很多时候我们往往需要操作多个数据库(微服务架构下一个...

尹吉欢
04/22
0
0
微信小游戏爆款秘笈 数据库MongoDB攻略篇

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB 发表于云+社区专栏 随着微信小游戏的爆发,越来越多开发者关注到MongoDB与小游戏业务的契合度。 ...

腾讯云加社区
08/13
0
0
十个 MongoDB 使用要点

从 mongodb 阶段性技术总结 中抽取并整理了对大家有帮助的十个要点: 1.mongodb 表名和字段名统一用小写字母 mongodb 是默认区分大小写的,为了避免以前在 mysql 下遇到的大小写敏感导致程序...

旁观者-郑昀
2013/02/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS配置Tomcat监听80端口,虚拟主机

Tomcat更改默认端口为80 更改的配置文件是: /usr/local/tomcat/conf/server.xml [root@test-a ~]# vim /usr/local/tomcat/conf/server.xml # 找到 Connector port="8080" protocol="HTTP/1......

野雪球
今天
5
0
《稻盛和夫经营学》读后感心得体会3180字范文

《稻盛和夫经营学》读后感心得体会3180字范文: 一代日本经营之圣稻盛和夫凭借刻苦勤奋的精神以及深植于佛教的商业道德准则,成为了“佛系”企业家的代表人物。在《稻盛和夫经营学》“领导人...

原创小博客
今天
3
0
java框架学习日志-5(常见的依赖注入)

依赖注入(dependency injection) 之前提到控制反转(Inversion of Control)也叫依赖注入,它们其实是一个东西,只是看的角度不同,这章详细说一下依赖注入。 依赖——指bean对象创建依赖于...

白话
今天
4
0
红外接收器驱动开发

背景:使用系统的红外遥控软件没有反应,然后以为自己接线错误,反复测试,结果烧坏了一个红外接收器,信号主板没有问题。所以自己开发了一个红外接收器的python驱动。接线参见https://my.os...

mbzhong
今天
2
0
ActiveMQ消息传送机制以及ACK机制详解

AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的手段来确保消息的分发是可靠的。 一. ActiveMQ消息传送机...

watermelon11
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部