在Vert.x中正确使用MongoClient的模式

时间:2018-11-13 17:19:53

标签: vert.x

我对MongoClient类感到非常不自在,当然是因为我不完全了解它是什么以及它是如何工作的。

  

第一次调用MongoClient.createShared实际上会创建   池,将使用指定的配置。

     

后续调用将返回使用相同客户端实例的新客户端实例   池,因此将不使用该配置。

这是否意味着该模式应为:

  1. 在启动功能中,我们通过调用来创建池

    mc = MongoClient.createShared(vx, config, "poolname");
    

    如果第一次调用成功,返回值mc是否重要?如果池创建失败,它的价值是什么?文档没有说。如果mongod没有运行,则会发生套接字异常,但是其他情况又如何呢?

  2. 在代码的另一个地方(例如,另一个顶点),我们可以写mc = MongoClient.createShared(vx, new JsonObject(), "poolname");来避免系统地需要访问共享对象。

  3. 同样,在我们需要访问数据库的另一个顶点中,如果我们定义MongoClient mc

    • 作为类字段,在这种情况下,只能通过stop()方法将其释放到池中,或者
    • 一旦我们不再需要连接以便再次将其释放到池中,它应该不是一个用MongoClient.createShared(...)填充并用mc.close()取消分配的变量吗?

我要写的如下

// Main startup Verticle
import ...

public class MainVerticle extends AbstractVerticle {
  ...      
  @Override
  public void start(Future<Void> sf) throws Exception {
     ...
     try {
       MongoClient.createShared(vx, config().getJsonObject("mgcnf"),  "pool");
     }
     catch(Exception e) {
       log.error("error error...");
       sf.fail("failure reason");
       return;
     }
     ...
     sf.complete();
  }
  ...some other methods
}

然后在其他地方

public class SomeVerticle extends AbstractVerticle {

    public void someMethod(...) {
    ...
    // use the database:
    MongoClient mc = MongoClient.createShared(vx,  new JsonObject(),  "pool");
        mc.save(the_coll, the_doc, res -> {
            mc.close();
            if(res.succeeded()) {
                ...
            }
            else {
                ...
            }   
       }
       ...
   }
   ...
}

那有意义吗?但是,这不是我可以在互联网上找到的示例中的内容。

1 个答案:

答案 0 :(得分:1)

不用担心池。不要使用它们。他们没有按照您的想法做。

在任何顶点的start方法中,在AbstractVerticleMongoClient.createShared(getVertx(), config)的继承者上设置一个字段(您称之为类字段,但实际上是实例字段)。用您的stop方法关闭客户端。就是这样。

您将看到的其他例外是​​:

  • 用户名/密码错误
  • 集群状态不正常
  • Java驱动程序的连接数限制为500或1,000(取决于版本),如果超过此连接数,您将收到一个例外情况

两者都将从包裹在VertxException中的驱动程序中传播出去。