在关系型数据库中,我们总是需要关闭使用的数据库连接,不然大量的创建连接会导致资源的浪费甚至于数据库宕机。这篇文章主要想解释一下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:
public class MongoConnFactory { private static MongoClient mongoClient = null; @SuppressWarnings("deprecation") public static DB getDB() throws UnknownHostException { DB conn = null; if(mongoClient == null){ intializeMongoClient(); } String dbName = AppConfig.getValue(Const.MONGODB_DBNAME); String username = AppConfig.getValue(Const.MONGODB_USERNAME); String password = AppConfig.getValue(Const.MONGODB_PASSWORD); conn = mongoClient.getDB(dbName); conn.authenticate(username, password.toCharArray()); return conn; } private static void intializeMongoClient() throws UnknownHostException { String host = AppConfig.getValue(Const.MONGODB_HOST); int port = AppConfig.getValueAsInteger(Const.MONGODB_PORT); mongoClient = new MongoClient( host , port ); } public static synchronized void closeConnection(){ if(mongoClient != null){ mongoClient.close(); } } }
原创文章,转载请注明出处:
http://bigcat2013.iteye.com/blog/2109633
谢谢!
相关推荐
该代码是C++ MongoDB的连接池代码实现。代码封装了一个连接池类对象,通过该对象提供的连接池来操作MongoDB,提升了性能,减少了数据库连接资源的开销。
mongodb Java连接池配置 用于避免Java连接mongodb数据库数过高引起的一系列问题
解决连接池不够的问题,多连接的问题。适用于mongoDB项目开发,感兴趣可以下载使用,记得好评哦。欢迎在下方留言
Mongodb解决连接池不够的问题,多连接的问题。
基于hyperf的mongodb连接池组件,暂不支持协程
Springboot配置MongoDB连接池源代码,包括有搭建Springboot项目,整合mybatis,mysql的代码。
Mongodb连接池、增删改查实例套装内包含三个实例很适合初学者学习
本文介绍了Spring Boot中使用MongoDB的连接池配置的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
python实现连接mongodb并执行相关操作,添加数据,并查询数据
koa-mongo, 用于koa的MongoDB中间件,支持连接池 koa-mongokoa是一个用于koa@2的mongodb中间件,支持连接池。NB: 如果使用了,则使用 koa-mongo@0.安装npm i koa-mongo --save用法app.use
主要介绍了基于java实现mongodb的数据库连接池,Java通过使用mongo-2.7.3.jar包实现mongodb连接池,感兴趣的小伙伴们可以参考一下
一个简单的测试工程,java使用mongodb数据库连接池,使用mongodb安全验证; 初始化连接池的信息;学习demo;代码
python使用mongoDB
spring.data.primary.mongodb.uri= mongodb://192.168.10.136:27017/eqt #spring.data.secondary.mongodb.uri= mongodb://192.168.10.136:27017/lxyz spring.data.secondary.mongodb.uri= mongodb://192.168.10.138:...
这是一个简单的基于mina框架的实现增删改查的工程,融合了mongodb mybatis proxool等多个技术。
有了这个,您可以在服务器的每个部分共享相同的 MongoDB 连接池。 在使用官方驱动程序,您传递给register的选项将传递给 Mongo 客户端。 mongodb驱动程序是 v3.xx 如果您不自己提供客户端(见下文),则 URL 选项是...
这是一个在整个 Hapi 服务器上共享公共 MongoDB 连接池的插件。 如果需要多个连接,选项可以是具有以下键的单个对象或相同类型的数组: 网址:可选。 MongoDB 连接字符串(例如mongodb://user:pass@localhost:...
连接mongdb类,可以链接mongdb数据
hyperf mongodb pool composer require yumufeng/hyperf-mongodb config 在/config/autoload目录里面创建文件 mongodb.php 添加以下内容 return [ 'default' => [ 'username' => env('MONGODB_USERNAME', ''), '...