当前位置: 首页 > 知识库问答 >
问题:

在Quarkus中将JOOQ与反应式SQL客户端一起使用

印子平
2023-03-14

我想使用Quarkus中的JooqDSL来构建我的SQL(并希望执行它们)
因此,我添加了以下Quarkus JOOQ扩展。

因为我想在我的项目中使用反应式PG SQL客户端,所以我问自己,例如JOOQ的< code>fetch()方法是否会阻塞线程?它是与引擎盖下的反应式vertx客户端兼容还是使用阻塞式客户端?看起来像后者,因为它不返回未来或者类似的东西。

在这种情况下,我应该只使用JOOQ来创建SQL字符串。

共有2个答案

充培
2023-03-14

我正在寻找一个解决方案来做同样的事情,我还没有测试它,但我遇到了这个回购:

https://github.com/jklingsporn/vertx-jooq

https://github . com/jklingsporn/quar kus-jooq-reactive-example

在quarkus中使用vert.x可能有助于充分发挥创造力。

公良鸿畅
2023-03-14

jOOQ的< code>ResultQuery

    < li> 结果查询

从jOOQ 3.17开始,还将有一种创建事务性<code>Publisher<code>类型的方法。

考虑到这一点,在反应式世界中,您将永远不需要调用任何传统的jOOQ阻塞执行方法。您将始终通过一些反应式流集成隐式执行jOOQ查询。

从 jOOQ 3.17 开始,所有阻塞 API(例如 ResultQuery.fetch())都将被注释为 org.jetbrains.annotations.Blocking,因此您可以获得 IDE 支持,以警告您即将执行在非阻塞上下文中可能没有意义的事情。

要使这一切正常工作,您需要为jOOQ提供R2DBC连接。R2DBC是一种SPI,它支持jOOQ等客户端库和r2dbc-postgres等R2DBC驱动程序之间的互操作性。就像JDBC一样,它作为SPI工作,而不是严格意义上的API。此外,它还直接与反应式流SPI集成,该流已通过FlowAPI集成在JDK 9中。

未来可能会有支持替代非阻塞驱动程序的工作,但在添加反应式支持时,R2DBC似乎是最可互操作的选择,我确实希望Vert。x和R2DBC团队将找到未来更紧密合作的方法。垂直。例如,x SQL客户端不直接实现反应式流SPI,Red Hat似乎对解决此问题不太感兴趣(目前):https://github.com/eclipse-vertx/vertx-sql-client/issues/249

所以,现在,这意味着你必须:

  • 将 jOOQ 与 R2DBC 一起使用,这是 jOOQ 支持的(不确定 Quarkus 是否支持 R2DBC,尽管我看不出有任何理由不应该支持 R2DBC)
  • 使用 jOOQ 仅生成 SQL 并使用 Vert.x 运行 SQL(您将失去许多类型安全性和便利性,以及对 MULTISET 等高级功能的访问,它依赖于 jOOQ 执行查询)

当然,考虑你是否真的需要被动总是很重要的。根据我个人的经验,这主要是编程风格问题,而不是实际的性能和/或负载要求。坚持使用阻塞范式和JDBC将大大简化您的日常工作,我怀疑您是否会注意到生产中可衡量的差异。

 类似资料:
  • 我想在我的反应式sql客户端事务中使用Kotlin协程。为了简单起见,我打算使用提供的助手函数<code>io.vertx.mutiny.sqlclient。此处文档中提到的池#withTransaction。由于传递的函数不是协程挂起函数,因此当我试图编译以下代码时,我得到了一个类似<code>的错误:挂起函数只能在协程体中调用 withTransaction的函数头如下所示 我问自己,是否还有

  • 在一节中,引入了接口,允许在请求中注入头,但必须返回同步响应。我们不能使用,这正是我的情况所需要的,因为我需要在头中添加一个令牌,而这个令牌是由返回的另一个restendpoint的请求检索的。 我如何在新的实现中实现这一点?如果不可能,有没有解决办法?

  • 我注意到Rest客户端上有两个指南:MicroProfile和Vertx。既然微文件支持异步,那么使用基于Vertx的Rest客户端有什么好处?

  • 我想使用Apache连接器和Jersey 2.3客户端进行HTTPS连接。 我尝试了以下方法: 但是,sslContext似乎被忽略,因为服务器的证书被拒绝为不受信任(sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径) 如果删除“.withConfig(clientConfig)”部分,SSL连接可

  • 问题内容: 是否可以将动态值设置为标头? 注册RequestInterceptor的实现会添加标头,但是无法动态设置标头值 我在github上发现了以下问题,其中一个注释者(lpborges)试图使用@RequestMapping注释中的标头做类似的事情。 问题答案: 解决方案是使用@RequestHeader批注而不是伪装的特定批注

  • 我试图测试Spring反应式Webclient的默认超时。为此,我创建了一个需要 10 小时才能返回响应的 rest endpoint。 我使用spring-reactive Webclient创建了一个rest客户端。但我看到,springReactiveWebclient一直在等待10个小时。 spring reactive Webclient没有任何默认超时吗?