参数配置
connectionsPerHost:与目标数据库能够建立的最大connection数量。这些connection用于与数据库之间读写数据。
threadAllowedToBlockForConnectionMultiplier:如果当前所有的connection都在使用中,则每个connection上可以有多少个线程排队等待。
connectionsPerHost与threadAllowedToBlockForConnectionMultiplier的关系详解:
connectionsPerHost * threadAllowedToBlockForConnectionMultiplier == 数据库允许的最大并发数量。
connectionsPerHost * threadAllowedToBlockForConnectionMultiplier 一定不能小于当前数据库的并发访问量,否则超出的线程会抛出Exception,导致服务器线程异常中断。
maxWaitTime: 线程等待连接变为可用的最长时间.默认为2分钟. 值为0意味着它不会等待. 负值意味着它将无限期地等待
一个线程访问数据库的时候,在成功获取到一个可用数据库连接之前的最长等待时间。比如:当前数据库的连接都在使用中,线程T10尝试访问数据库。此时T10会在某个connection上排队等待。如果超过maxWaitTime都没有获取到这个连接的话。该线程就会抛出Exception(此处为巨坑,一定要注意)。所以maxWaitTime一定要设置的足够大,以免由于排队线程过多造成的访问数据库失败的情况。
maxConnectionIdleTime: 线程池中连接的最大空闲时间, 0标志Udine空闲时间没有限制,超过这个时间会被关闭.
maxConnectionLifeTime: 线程池中连接的最长生存时间. 0表示没有限制. 超过寿命的会被关闭,必要时通过新连接进行替换.
connectTimeout:与数据库建立连接的timeout。
socketTimeout:数据库连接读取和写入数据的timeout。
soketKeepAlive:保持与数据库之间的连接。如果保持连接,则与数据库的连接一旦建立,就不会关闭,那么后续的数据库访问就不需要重新建立连接了。
autoConnectRetry:自动重试与服务器建立连接。
maxAutoConnectRetryTime:最多尝试重建连接多长时间。
代码实现
import java.util.ArrayList;
import java.util.List;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoClientOptions.Builder;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoDatabase;
public class MongoManager {
private static MongoClient mongoClient=null;
//对mongoClient初始化
private static void init(){
//连接池选项
Builder builder = new MongoClientOptions.Builder();//选项构建者
builder.connectionsPerHost(8);//每个地址最大请求数
builder.threadsAllowedToBlockForConnectionMultiplier(4);
builder.connectTimeout(10000);//设置连接超时时间
builder.maxWaitTime(120000); //设置最大等待时间
builder.socketTimeout(1500);//读取数据的超时时间
MongoClientOptions options = builder.build();
List<ServerAddress> hosts = new ArrayList<ServerAddress>();
String host = "10.238.103.138";
int port =27017;
hosts.add(new ServerAddress(host,port));
List<MongoCredential> credentials = new ArrayList<MongoCredential>();
// MongoCredential credential = MongoCredential.createCredential("mongodb","test","123".toCharArray()); // 需要验证
// credentials.add(credential);
mongoClient=new MongoClient(hosts, credentials, options);
}
public static MongoDatabase getDatabase(){
if(mongoClient==null){
init();
}
return mongoClient.getDatabase("test");
}
}