我想使用Quarkus中的JOOQ来构建我的SQL (希望执行它们)。
因此,我添加了以下Quarkus JOOQ扩展。
因为我想在我的项目中使用反应性PG SQL客户端,所以我在问自己,例如,JOOQ的fetch()
方法是否会阻塞线程?它是否与引擎盖下的反应性vertx客户端兼容,还是使用阻塞客户端?看起来像后一个,因为它不返回未来或类似的东西。
在这种情况下,我应该只使用JOOQ来创建SQL字符串。
发布于 2022-06-19 08:19:58
可以反应性地使用jOOQ API的哪些部分?
jOOQ的ResultQuery<R>
扩展了Publisher<R>
,因此您可以在任何反应流实现中放置jOOQ查询。在Publisher
中有3种主要的jOOQ亚型:
ResultQuery
扩展Publisher<R>
RowCountQuery
扩展Publisher<Integer>
Batch
扩展Publisher<Integer>
从jOOQ 3.17开始,还有一种创建类型的方法。
考虑到这一点,在反应性世界中,您将永远不需要调用任何传统的jOOQ阻塞执行方法。您将始终通过一些反应性流集成隐式执行jOOQ查询。
避免对阻塞API的调用
从jOOQ 3.17开始,所有阻塞API (例如,ResultQuery.fetch()
将被注释为org.jetbrains.annotations.Blocking
),因此您将得到IDE支持来警告您,您即将做一些在非阻塞上下文中可能没有意义的事情。
支持实现
要使这其中的任何一个工作,您需要为jOOQ提供一个R2DBC连接。R2DBC是一个SPI,它支持客户端库(如jOOQ和R2DBC驱动程序,如r2dbc-postgres )之间的互操作性。就像JDBC一样,它的工作方式是SPI,而不是严格意义上的API。此外,它还直接集成了通过Flow
API集成在JDK 9中的反应性流SPI。
未来可能会有支持替代非阻塞驱动程序的工作,但是在添加反应性支持时,R2DBC似乎是最可互操作的选择,我确实希望Vert.x和R2DBC团队在未来能够找到更紧密合作的方法。例如,Vert.x SQL客户端没有直接实现反应性流SPI,Red似乎对在这里继续处理这个问题不太感兴趣:https://github.com/eclipse-vertx/vertx-sql-client/issues/249。
因此,就目前而言,这意味着你必须:
MULTISET
,它依赖于执行查询的jOOQ )关于反应式执行的附带说明
当然,想一想你是否真的需要做出反应是很重要的。在我个人的经验中,这主要是编程风格的问题,而不是实际的性能和/或负载需求。坚持阻塞模式和JDBC将大大简化您的日常工作,我怀疑您是否会注意到生产中的可测量的差别。
发布于 2022-06-19 13:45:09
我正在寻找一个解决方案来做同样的事情,我还没有测试它,但我偶然发现了这个回购:
https://github.com/jklingsporn/vertx-jooq
https://github.com/jklingsporn/quarkus-jooq-reactive-example
使用夸夸斯中的vert.x可能会有帮助。
https://stackoverflow.com/questions/72669626
复制相似问题