我对MongoClient
类感到非常不自在,当然是因为我不完全了解它是什么以及它是如何工作的。
第一次调用
MongoClient.createShared
实际上会创建 池,将使用指定的配置。后续调用将返回使用相同客户端实例的新客户端实例 池,因此将不使用该配置。
这是否意味着该模式应为:
在启动功能中,我们通过调用来创建池
mc = MongoClient.createShared(vx, config, "poolname");
如果第一次调用成功,返回值mc
是否重要?如果池创建失败,它的价值是什么?文档没有说。如果mongod
没有运行,则会发生套接字异常,但是其他情况又如何呢?
在代码的另一个地方(例如,另一个顶点),我们可以写mc = MongoClient.createShared(vx, new JsonObject(), "poolname");
来避免系统地需要访问共享对象。
同样,在我们需要访问数据库的另一个顶点中,如果我们定义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 {
...
}
}
...
}
...
}
那有意义吗?但是,这不是我可以在互联网上找到的示例中的内容。
答案 0 :(得分:1)
不用担心池。不要使用它们。他们没有按照您的想法做。
在任何顶点的start
方法中,在AbstractVerticle
到MongoClient.createShared(getVertx(), config)
的继承者上设置一个字段(您称之为类字段,但实际上是实例字段)。用您的stop
方法关闭客户端。就是这样。
您将看到的其他例外是:
两者都将从包裹在VertxException
中的驱动程序中传播出去。