【问题标题】:Targeting multiple database types with generated JOOQ code使用生成的 JOOQ 代码定位多种数据库类型
【发布时间】:2018-04-20 08:34:12
【问题描述】:

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

是否有一些聪明的方法可以使生成的相同 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 初始化/迁移脚本。

【问题讨论】:

    标签: spring-boot mariadb h2 spring-jdbc jooq


    【解决方案1】:

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

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

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

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

    你说:

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

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

    你应该只在以下情况下这样做:

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

    【讨论】:

    • 很好的答案和建议,谢谢。是的,我的 MariaDB 数据库不叫PUBLIC,而是叫foo。我终于设法更改了 H2 模式的名称,并告诉 H2 使用小写的表和字段名称。所以现在我实际上能够对 H2 和 MariaDB 使用相同的生成 JOOQ 源。在我让它工作之前不能放手,但现在我正在听从你的建议,并在开发和生产中切换到 MariaDB。 :)
    猜你喜欢
    • 2014-07-21
    • 2017-11-28
    • 2020-01-05
    • 2021-02-20
    • 2022-01-12
    • 2022-07-20
    • 2016-06-12
    • 2019-11-09
    • 2019-02-16
    相关资源
    最近更新 更多