用于jdbc的Vertx worker verticle池

时间:2016-12-29 20:55:18

标签: jdbc vert.x

我是Vert.x的新手,我想实现一个工作站Verticle池来使用BoneCP进行数据库查询。但是,我对如何“调用”它们以及如何在它们之间共享BoneCP连接池感到有点困惑。

我在Vertx DeploymentManager source中看到同步调用start(Future)方法,然后将Verticle保留在内存中直到取消部署。 start方法完成后,在worker Verticle上调用方法的正确方法是什么?如果我部署了多个Verticle实例(使用DeploymentOptions.setInstances()),Vertx会在它们之间进行负载平衡吗?

我看到Vert.x附带了一个JDBC客户端和一个工作池,但它可以使用的数据类型有限,因为它使用EventBus并序列化数据库返回的所有数据。我需要处理许多不同的数据类型(包括日期,BigDecimals和二进制对象),我希望尽可能避免序列化,而是在worker verticle中进行查询,处理结果并通过Future或AsyncResult返回一个对象(我相信这是在堆上完成的,所以不需要序列化;这是正确的吗?)。

请帮我解决所有这些问题:)如果你举例说明我该如何运作,我将非常感激!

谢谢!

2 个答案:

答案 0 :(得分:0)

start(...)方法中,使用事件总线注册事件侦听器,因为这是您与Verticle(worker或不是)交互的方式。 是的,如果部署了许多实例,Vert.x将使用循环法向这些实例发送消息。

对于您所描述的内容,Vert.x可能不是最合适的,因为它最适合异步I / O. 您可能最好使用标准Java并发工具来管理负载,即执行者和朋友。

答案 1 :(得分:0)

我会逐一回答你的问题。

  

如何“召唤”他们工作

使用EventBus调用您的工作人员Verticle。这是他们之间沟通的正确方式。请看这个例子:
https://github.com/vert-x3/vertx-examples/blob/master/core-examples/src/main/java/io/vertx/example/core/verticle/worker/MainVerticle.java#L27

  

如何在它们之间共享BoneCP连接池。

别。而是为每个创建一个小连接池。否则,它将导致意外行为。

config.setMinConnectionsPerPartition(1);
config.setMaxConnectionsPerPartition(5);
config.setPartitionCount(1);
  

Vertx会在它们之间进行负载均衡

没有。这就是@Jochen Bedersdorfer和我建议使用EventBus的原因。您可以按照建议引用您的工作者Verticle,但是您仍然坚持使用1:1配置。

  

通过Future或AsyncResult返回一个对象(我相信这已经完成了   堆上,所以不需要序列化;这是对的吗?)

这是对的。但同样,你仍然坚持1:1的映射。在序列化(使用缓冲区)方面,性能要差得多。

如果你仍然需要这样的东西,也许你根本不应该使用工作者Verticle,而是像.executeBlocking这样的东西:
https://github.com/vert-x3/vertx-examples/blob/master/core-examples/src/main/java/io/vertx/example/core/execblocking/ExecBlockingExample.java#L25

相关问题