上下文:我想将模块分解为子模块。每个人都有责任感。在细分之后,我想编写/编排每个子模块提供的服务来构建聚合对象。
我当前的解决方案:该组合使用了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时,我在短时间内看到了
请纠正我:)