jOOQ 依赖于不稳定版本的 r2dbc-spi 库
Posted
技术标签:
【中文标题】jOOQ 依赖于不稳定版本的 r2dbc-spi 库【英文标题】:jOOQ depends on unstable version of r2dbc-spi library 【发布时间】:2022-01-04 08:06:03 【问题描述】:maven central 中的当前 jOOQ 版本 3.15.4 取决于 r2dbc-spi
的不稳定版本 0.9.0.M1
(甚至不是最新的里程碑版本)。我们有严格的政策不允许在生产中使用不稳定的库,因此我们不能使用最新的 jOOQ 版本。
是否可以重写依赖并将r2dbc-spi
降级为0.8.6
(最新稳定但仍然不是1.x
)?
【问题讨论】:
FWIW,您可以等待几天(准确地说是 12 月 6 日),直到 R2DBC 0.9 GA 发布,请参阅 github.com/r2dbc/r2dbc-spi/milestone/19。 【参考方案1】:尽管有里程碑/候选发布后缀,但将 0.9.x
依赖项而不是 0.8.x
添加到 jOOQ 3.15 有几个很好的理由:
1。 R2DBC SPI 稳定性
总的来说,R2DBC SPI 还不太稳定。 0.x
版本方案暗示事情仍在“进行中”,并且仍在实施向后不兼容的 SPI 更改。 jOOQ(即我)在最近的 SPI 设计决策中参与了相当多的工作,以确保正确解决 jOOQ 已知的通常要求。其中包括在 SQL Server 或 mysql 中调用存储过程时对流式操作的要求,where result sets, exceptions, and update counts can be interleaved,或者还有输出参数的流式传输方式。
因此,对于 jOOQ 来说,将某个版本标记为“里程碑”、“候选版本”还是“稳定”版本似乎并不重要,因为即使在稳定版本之后,也会有中断 SPI 更改。
2。 jOOQ 正在向你隐藏 R2DBC
对你来说,这可能会或可能不会太重要。虽然我一般了解您的依赖版本政策,但在这种特殊情况下,您使用的是 beta 软件 (R2DBC),这本身就是一种风险。 jOOQ 将尝试保护您免受任何不稳定因素的影响,因为您几乎不会在客户端代码中看到 R2DBC API(就像您在客户端代码中几乎看不到 JDBC API),并且现状经过了很好的集成测试以确保 jOOQ 代码工作正常。
从您的应用程序的角度来看,jOOQ 只是一种反应式流实现,它可以随时将 R2DBC 切换为其他东西。事实上,它已经做到了。您也可以将其用作 JDBC 之上的“阻塞流”。
3。 jOOQ 对新 R2DBC SPI 功能和修复的依赖
当 jOOQ 3.15 支持 R2DBC 时,依赖 SPI 及其驱动程序的最新实现似乎很有用,以便更好地体验 jOOQ 的内部细节。事实上,绑定到它们现在已经帮助改进它们并发现了一些可用性问题,例如这个batching specification problem,它没有明确指定,因此在每个驱动程序的基础上实现不同。
此外,如果不解决 SPI 中的缺陷,就无法解决一些驱动程序错误修复,因此它们没有向后移植到 0.8.6。
你的问题
jOOQ 没有集成测试版本0.8
的 SPI 和 R2DBC 驱动程序,所以这个降级是否适合你,由你自己决定。如果您在使用 R2DBC 0.8
的 jOOQ 中发现 0.9
不会发生的问题,那么 jOOQ 可能不会解决该问题。
因此,虽然您的政策会得到履行,但您的质量可能仍会受到影响。我建议您在这种特殊情况下调整您的策略,至少只要您使用 R2DBC 作为 jOOQ 的传递依赖项,而不是直接依赖项。
关于:
甚至不是最新的里程碑版本
在发布时,驱动程序还没有为最新的 SPI 里程碑版本做好准备。现在情况仍然如此,当我们计划将 SPI 依赖项升级到候选版本或更新版本时:https://github.com/jOOQ/jOOQ/issues/12193。
这就是使用 R2DBC 等新事物时的生活。它运行良好,但在幕后情况仍然不稳定。知道事情最终会稳定下来,你已经可以安于现状了。
更多资源:
jOOQ 3.15 R2DBC 支持票:https://github.com/jOOQ/jOOQ/issues/11700 jOOQ 3.16 R2DBC 已知限制票:https://github.com/jOOQ/jOOQ/issues/11717 jOOQ 3.16 依赖升级票:https://github.com/jOOQ/jOOQ/issues/12193 关于 R2DBC 邮件列表的各种讨论:https://groups.google.com/g/r2dbc【讨论】:
以上是关于jOOQ 依赖于不稳定版本的 r2dbc-spi 库的主要内容,如果未能解决你的问题,请参考以下文章
如何调试 Gradle 为啥使用我在依赖子项目中指定的不同版本的库?
服务“acme.file_uploader”依赖于不存在的服务“请求”