我正在使用带有 Vertx 的 Apache Cayenne。Vertx 依赖于一切都是异步的,它会主动寻找阻塞的线程。
所以执行类似...
List<Artist> artists = ObjectSelect.query(Artist.class).select(context);
...将导致 Vertx 抱怨以下内容:
WARNING: Thread Thread[vert.x-eventloop-thread-0,5,main] has been blocked for 4750 ms, time limit is 2000
请注意,实际上有一些方法可以通过将代码包装在一个executeBlocking
函数中来解决这个问题,如下所示:
// Turning synchronous code to async in Vertx
vertx.executeBlocking<Any>({ future ->
List<Artist> artists = ObjectSelect.query(Artist.class).select(context)
future.complete(artists)
}, { res ->
// The result
})
然而,像这样继续包装我的 ORM 函数变得很痛苦。
我想知道是否有标志或开关可以使 Cayenne 异步?或者,如果没有这样的标志,我想知道是否有办法使用Mauricio的Postgres Async Driver。我选择那个特定的异步驱动程序是因为 Vertx为它提供了本机支持。
抱歉,没有使 Cayenne 异步的神奇开关。Cayenne 内部严重依赖 JDBC,而 JDBC 又是同步的(并且可能永远是,请参阅此处的精彩讨论)。
此外,对 JDBC 的依赖使得使用非 jdbc 驱动程序变得非常困难,所以这里也没有运气。
因此,适合您环境的自定义包装器似乎是您最好的(如果不是唯一的话)选择。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句