RxJava连接池

时间:2015-12-01 09:34:24

标签: asynchronous connection-pooling rx-java

上下文:我想将模块分解为子模块。每个人都有责任感。在细分之后,我想编写/编排每个子模块提供的服务来构建聚合对象。

我当前的解决方案:该组合使用了RxJava。首先,我在一个flatMap中加载一个ObjectA列表,然后在异步调用(使用defer和Schedulers.io)多个服务,最后在flatMap内部使用zip运算符构建一个新的Object。

objectsA.flatMap {
   Observable<A> oa = loadAAsync();
   Observable<B> ob = loadBAsync();
   Observable<C> oc = loadCAsync();
   return Observable.zip(oa, ob, oc, (a, b, c) -> { build() };
}

方法loadXAsync调用从数据库加载对象的服务。

我的问题:此解决方案目前很慢。原始的x5倍(单个SQL请求)。我有点失望。实际上,每次添加新的加载部件时,解决方案都会变慢。只有A,相当不错,B降低性能,C等等。我的第一感觉是使用的连接池(HiakriCP)无法提供足够的数据库连接,成为瓶颈。目前我的游泳池大小为10.HikariWiki说足够大。

我的问题:你如何处理这个案子? RxJava&#34;专家&#34;是否正常? ?你增加了游泳池的大小吗?或者你是否限制线程数?

更新1 @divers:也许我对连接池完全错了。我会试着解释一下我的想法。

调用是异步进行的。每个新线程都会选择一个连接并向DB发出请求。 Schedulers.io使用将根据需要增长的线程池。如果我发出了数百个ObjectA。每个人都会发出5个sql请求。

我认为(需要检查一下)flatMap没有阻止。因此,我会有很多线程和大量5个请求并行批处理。例如:objectA#1发射 - &gt; 5个请求,objectA#2在objectA#1结束之前发出,因此并行5个请求。

我的游泳池大小是固定的,包含10个连接。这就是为什么我认为我的问题来自这里。

*更新2 * :以下是我在项目中尝试的SO Question / code

*更新3 * :将我的游泳池大小配置为50.当我监视Hikari MBean时,我在短时间内看到了

  • ActiveConnections = 50(因此使用了所有连接)
  • IdleConnections = 0
  • ThreadsAwaitingConnection:我看到的最大值是210。

请纠正我:)

0 个答案:

没有答案