如何在Java中正确使用具有多个线程的MongoDB?

时间:2017-02-08 20:04:05

标签: java multithreading mongodb

我正在使用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);
}

即使我只使用一个线程使用此代码,一段时间后也会出现相同的错误。使用多个线程时,错误会更快。 如果有人可以帮助我,我会感恩,我在大学的最后工作取决于那个。

1 个答案:

答案 0 :(得分:2)

经过多次测试后,我可以找到问题的原因。 在getDB方法中,我为数据库中的每个插入创建了一个新连接。将连接数乘以客户端数量,我“过度连接”了我的数据库。 我通过替换

来修复它
loc_var

使用以下行:

MongoClient mongoClient = new MongoClient(new ServerAddress(HOST, port), opts);
在课程开头的

和行:

    MongoClient mongoClient;

在我移除的另一个地方。

现在它运作良好。