Spring boot 使用生成的JOOQ代码定位多个数据库类型

Spring boot 使用生成的JOOQ代码定位多个数据库类型,spring-boot,mariadb,h2,spring-jdbc,jooq,Spring Boot,Mariadb,H2,Spring Jdbc,Jooq,我认为现在在开发过程中使用一个RDBMS,在生产过程中使用另一个RDBMS是很常见的。我想在开发中使用H2,在生产中使用MariaDB,用于基于Spring引导和JOOQ的应用程序 是否有一些聪明的方法使生成的相同JOOQ代码在开发和生产环境中都能工作,或者我是否需要根据目标环境生成两组代码?如果后者是正确的,如何以理智的方式做到这一点,例如使用nu.studer.jooqgradle插件 每当我试图对MariaDB服务器使用H2数据库生成的源代码时,就会引发类似这样的异常: org.maria

我认为现在在开发过程中使用一个RDBMS,在生产过程中使用另一个RDBMS是很常见的。我想在开发中使用H2,在生产中使用MariaDB,用于基于Spring引导和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初始化/迁移脚本。

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

您遇到的错误可能与以下事项之一有关:

  • 您的MariaDB数据库中可能没有
    PUBLIC
    架构。您可以确保H2和MariaDB之间的模式名称匹配,也可以通过在配置上使用或通过使用来关闭jOOQ中的模式名称生成
  • 不同的数据库具有不同的默认区分大小写设置。在H2中,默认情况下,所有表都是大写的,但在MariaDB安装中可能不是这种情况。您可以确保两个数据库中的大小写相同,或者关闭反勾号/引号的生成。这可以通过将其设置为
    (按原样)
  • 它可能与jOOQ无关,您根本没有查询表的适当权限
不相关的,关于使用不同供应商进行开发和生产的简短说明 你说:

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

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

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

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

非常好的回答和建议,谢谢。是的,我的MariaDB数据库不是名为
PUBLIC
,而是名为
foo
。我最终设法更改了H2模式的名称,并告诉H2使用小写的表名和字段名。所以现在我实际上能够对H2和MariaDB使用相同的生成的JOOQ源。在我让它工作之前,我不能放弃它,但现在我听从你的建议,在开发和生产方面都转向MariaDB.:)