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

Seb*_*ian 2 h2 spring-jdbc mariadb jooq spring-boot

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

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

每当我尝试使用针对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`
Run Code Online (Sandbox Code Playgroud)

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

Luk*_*der 10

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

你得到的错误可能与以下之一有关:

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

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

你说:

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

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

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

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