我正在使用mongo-java-driver-3.0.0库继续在我的MongoDB实例中插入许多数据。问题是当我尝试使用多个线程(模拟多个用户)时,在一些插入后发生以下错误:
INFORMAÇÕES: Closed connection [connectionId{localValue:816}] to
localhost:27017 because the pool has been closed. Exception in thread
"user_4" com.mongodb.MongoSocketReadException:
Prematurely reached end of stream
我正在调用实例并继续插入的代码是:
public static FachadaMongo getInstancia() {
if (instancia == null) {
instancia = new FachadaMongo();
}
return instancia;
}
public MongoDatabase getDB(String HOST, String PORT, String DB_NAME) {
MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
//build the connection options
builder.maxConnectionIdleTime(60000);//set the max wait time in (ms) 60 segundos
MongoClientOptions opts = builder.build();
int port = Integer.parseInt(PORT);
MongoClient mongoClient = new MongoClient(new ServerAddress(HOST, port), opts);
MongoDatabase db = mongoClient.getDatabase(DB_NAME);
return db;
}
public MongoCollection getColecao(String HOST, String PORT, String DB_NAME, String colecao) {
MongoCollection col = FachadaMongo.getInstancia().getDB(HOST, PORT, DB_NAME).getCollection(colecao);
return col;
}
public void insert(String HOST, String PORT, String DB_NAME, Document documento) {
this.getColecao(HOST, PORT, DB_NAME, "documentos").insertOne(documento);
}
即使我只使用一个线程使用此代码,一段时间后也会出现相同的错误。使用多个线程时,错误会更快。 如果有人可以帮助我,我会感恩,我在大学的最后工作取决于那个。
答案 0 :(得分:2)
经过多次测试后,我可以找到问题的原因。 在getDB方法中,我为数据库中的每个插入创建了一个新连接。将连接数乘以客户端数量,我“过度连接”了我的数据库。 我通过替换
来修复它loc_var
使用以下行:
MongoClient mongoClient = new MongoClient(new ServerAddress(HOST, port), opts);
在课程开头的和行:
MongoClient mongoClient;
在我移除的另一个地方。
现在它运作良好。