java中mongoDB连接遇到的问题

用单例模式建立mongoDB的连接,需要每次操作完关闭连接吗?

  1. 关于建立单例模式的MongoDB连接,参考这里MongoClient连接池用法

  2. 建立了之后,每次操作调用同一个实例,MongoClient又是线程安全的,貌似就没有什么问题了。但是 突然想到,这些连接获取后,操作完不主动释放,会不会一直被占有?

– 于是开始找各种资料,这篇文章给出了很形象的说明,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()方法即可。

MongoDB带安全验证的连接如何设置MongoClientOptions

管理如何创建MongoClient 这篇文章给了详细的介绍 MongoDB 连接 for java

由于我的需要安全验证,我就选择了这种

 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();   

可是 运行项目,却报出了认证错误,查了之后发现。。方法不对,。

 Arrays.asList(MongoCredential.createMongoCRCredential(  
            "admin", "myinfo", "123456".toCharArray()));  

改为

 Arrays.asList(MongoCredential.createCredential(  
            "admin", "myinfo", "123456".toCharArray()));  

好了就。。。

发布了66 篇原创文章 · 获赞 19 · 访问量 13万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览