java mongodb autoconnectretry_MongoDB Java 连接池的注意事项

1.Mongo对象内部实现了一个连接池。Mongo对象是线程安全的,因此可以只创建一个,在多线程环境下安全使用。因此,我们可以用将Mongo变量作为一个Singleton类的成员变量,从而保证只创建一个连接池。Mongo.close方法将关闭当前所有活跃的连接。所以要在web工程被从Tomcat或者GlassFish容器中注销的时候确保调用close方法。

2.DB对象

DB对象可以通过Mongo.get方法获得,代表了和数据库的一个连接。默认情况下,当执行完数据库的查询或者更新操作后,连接将自动回到连接池中。不需要我们手动调用代码放回池中。至于如何实现,我猜测是update,query,save方法内部有finally块,那里面有还连接到池中的代码。

3.手动还连接入池

DB对象也允许在一个连接上执行多个操作,比如下面的代码:



DB db...;

db.requestStart();

code....

db.requestDone();

requestStart 会让自动还连接入池失效,因此必须确保requestDone一定能够被调用。这里应该用finally块会更严密一些。

4.示例代码,下面的类实现了Lazy loading的Singleton模式,里面的成员变量Mongo mongo因此只会实例化一次。注意连接池大小和重连设置。

package com.freebird.helper;

import com.mongodb.Mongo;

import com.mongodb.MongoOptions;

import com.mongodb.DB;

/**

* Describe class DBManager here.

* example:

* 初始化:DBManager.getInstance().init("74.208.78.5",27017,200);

* 之后,每次通过下面的代码获取数据库对象

* DBManager.getInstance().getDB();

* Created: Sat Dec 17 10:45:24 2011

*

* @author chenshu

* @version 1.0

*/

public class DBManager {

public static final String DB_NAME = "kaimei";

public static final String MESSAGE_COLLECTION = "email";

public static DBManager getInstance(){

return InnerHolder.INSTANCE;

}

/**

* Creates a new DBManager instance.

*

*/

private DBManager() {

}

private static class InnerHolder{

static final DBManager INSTANCE = new DBManager();

}

public DB getDB(){

return mongo.getDB(DB_NAME);

}

private Mongo mongo;

public void init(final String ip, int port, int poolSize) throws java.net.UnknownHostException {

System.setProperty("MONGO.POOLSIZE", String.valueOf(poolSize));

if (mongo == null) {

mongo = new Mongo(ip, port);

MongoOptions options = mongo.getMongoOptions();

options.autoConnectRetry = true;

options.connectionsPerHost = poolSize;

}

}

}

原文链接:

http://blog.csdn.net/sheismylife/article/details/7090526

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值