gpt4 book ai didi

spring-boot - 使用生成的 JOOQ 代码针对多种数据库类型

转载 作者:行者123 更新时间:2023-12-02 18:20:31 25 4
gpt4 key购买 nike

我想现在在开发过程中使用一种 RDBMS 而在生产中使用另一种 RDBMS 是很常见的。我想在基于 Spring Boot 和 JOOQ 的应用程序的开发中使用 H2,在生产中使用 MariaDB。

是否有一些巧妙的方法可以使生成的相同 JOOQ 代码在开发和生产环境中都工作,或者我是否需要根据目标环境生成两组代码?如果后者是真的,如何以理智的方式做到这一点,例如使用 nu.studer.jooq gradle 插件?

每当我尝试针对 MariaDB 服务器使用从 H2 数据库生成的源时,都会抛出这样的异常:

org.mariadb.jdbc.internal.util.dao.QueryException: SELECT command denied to user 'foo'@'localhost' for table 'FOO'
Query is: select `PUBLIC`.`FOO`.`ID`, `PUBLIC`.`FOO`.`NAME`, `PUBLIC`.`FOO`.`INFO` from `PUBLIC`.`FOO`

我对 H2 和 MariaDB 使用相同的 Flyway 初始化/迁移脚本。

最佳答案

您不需要为每个生产环境生成两组类。 jOOQ 生成的类与供应商无关,除非您使用供应商特定的功能,例如例如 MariaDB 的 enum 类型或存储过程等。

您收到的错误可能与以下情​​况之一有关:

  • 您的 MariaDB 数据库中可能没有 PUBLIC 架构。您可以确保 H2 和 MariaDB 之间的模式名称匹配,也可以使用 Settings.renderSchema 关闭 jOOQ 中的模式名称生成。根据您的配置,或使用 schema mapping .
  • 不同的数据库具有不同的默认区分大小写设置。在 H2 中,默认情况下,所有表都是大写的,但在您的 MariaDB 安装中可能不是这种情况。您可以确保两个数据库中的大小写相同,或者关闭反引号/引号的生成。这可以通过 Settings.renderNameStyle 来完成,将其设置为 AS_IS
  • 它可能与 jOOQ 无关,而且您根本没有查询该表的适当权限。

不相关,关于使用不同供应商进行开发和生产的简短说明

你说:

I imagine that it nowadays is quite common to use one RDBMS during development and another RDBMS in production. I'd like to use H2 in development and MariaDB in production for a Spring Boot and JOOQ based application.

我真的非常反对这种做法。您可以非常轻松地在 docker 中设置生产数据库并直接对其进行操作。虽然 H2 可以模拟一些 MariaDB 功能,但它远不一样。通过人为地将自己限制在 H2 和 MariaDB 之间的最小公分母上,您会错过许多很酷的 MariaDB 功能,包括 CTE、窗口函数、存储过程等。并且您将不断地与 H2 和 MariaDB 之间的细微差异作斗争。堆栈各个级别的供应商。

您应该只在以下情况下执行此操作:

  • 您实际上需要在生产中支持多个数据库
  • 您确实确实受益于性能的略微提高,例如用于集成测试(但我对此表示怀疑,使用 docker)。

关于spring-boot - 使用生成的 JOOQ 代码针对多种数据库类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47166440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com