mongo_open 频繁打开 mongo 连接报错 SEVERE: Exception opening socket

imagepng

脚本主要解释:ipport 是 5 个 mongodb 的 ip 和端口连接。从每个 mongo 读取 10 条数据(排序好的),再通过 A6 进行合并,合并之后再取 10 条数据出来。

40 个线程(并发),每个线程连续请求 40 次,前半段不报错,后半段报错 SEVERE: Exception opening socket。
如果低于 40 现象不容易出现,出现概率低,测试的时候必须要 40 线程(并发)之上

SEVERE: Exception opening socket 是在 C2 格子中报出来的错误。
这个错误只是在控制台打印了一下,集算器脚本还在继续执行,会造成返回数据为空。如果不看控制台很难发现这个问题,会造成数据缺失,给用户展示脏数据

为了验证这个猜想:写了一段代码,频繁建立 mongo 和关闭 mongo,java 程序也会报出这个错误:
public static void main(String[] args) {

	for (int i = 0; i < 50; i++) {
		new Thread(new Runnable() {
			@Override
			public void run() {
				String ip = SystemProperties.getMongoHost(); 
    			int port = SystemProperties.getMongoPort();
    			for (int j = 0; j < 1000; j++) {
    				MongoClient mongo = new MongoClient(ip, port);
	    			MongoDatabase db = mongo.getDatabase("8a9e232962fcf6cc016324ed2ada1fb5");
	    			MongoCollection<Document> mongoCollection = db.getCollection("dictionary");
	    			Long count =  mongoCollection.countDocuments(new BasicDBObject());
	    			System.out.println(Thread.currentThread().getName()+"|"+count);
	    			mongo.close();
				}
			}
		}).start();
	}
	
}

}

40 个线程同时访问都架不住,怎么解决这个问题呢?java 代码中是用链接池的概念来解决,打开一个 MongoClient,给 MongoClient 设置连接池数量,每次请求 mongo 都是通过这个 MongoClient 来处理,避免每次都会创建 MongoClient 和关闭 MongoClient。

集算器 mongo_open 用法支持连接池的概念吗?