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

时间:2017-11-07 19:58:57

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

我认为现在在开发过程中使用一个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初始化/迁移脚本。

1 个答案:

答案 0 :(得分:9)

您不需要为每个生产环境生成两组类。 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,窗口函数,存储过程等等。你会不断地对抗之间的细微差别。各种级别的供应商。

您应该只在以下时间执行此操作:

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