簡體   English   中英

jOOQ如何根據配置處理多個數據庫引擎

[英]How can jOOQ be used to deal with multiple database engine depending on configuration

我是一個經驗豐富且快樂的 jOOQ 用戶。

我現在正在開發一個需要支持多個數據庫引擎的項目(至少 PostgreSQL、MySQL、Oracle)。

我們想要足夠低級別的東西來控制我們的查詢。 JPA/Hibernate 對我們來說太高級了。

我知道 jOOQ 使用元模型,並且該元模型是從數據庫模式生成的。

有沒有辦法針對不同的數據庫引擎重用相同的 jOOQ 查詢定義(具有相同的模式,除了引擎特定的差異)?

如果我們需要在必要時重新編譯 java 類,那很好。 編譯時配置對我們來說很好。

jOOQ 就是為此而設計的。 你需要做這些事情:

  1. 根據您的 JDBC 連接,准備好帶有SQLDialectConfiguration 那是容易的部分。 Configuration將為您的所有 jOOQ 查詢自動生成特定於供應商的 SQL。 這可以在運行時完成。 無需任何編譯時間調整。
  2. 確保您的表/列始終使用相同的大小寫, 或關閉 jOOQ 標識符中不區分大小寫的行為的引用(取決於您的 MySQL 配置,這可能還不夠, 請參閱 MySQL 手冊)。 然后,您可以在所有其他方言上重新使用從任何數據庫方言生成的代碼。
  3. 確保只使用帶有@Support({ MYSQL, ORACLE, POSTGRES })注釋的 jOOQ API。 例如,不能使用DSL.toDate() ,因為它不支持 MySQL,但可以使用DSL.trunc() ,因為所有 3 個目標方言都存在。

我們也越來越多地在 jOOQ 手冊中添加方言特定信息,例如SHL() function

-- ASE, HSQLDB, SQLDATAWAREHOUSE, SQLSERVER, SYBASE
(1 * CAST(power(2, 4) AS int))

-- AURORA_MYSQL, AURORA_POSTGRES, COCKROACHDB, CUBRID, MARIADB, MEMSQL, MYSQL, POSTGRES, SQLITE, VERTICA
(1 << 4)

-- DB2, INFORMIX
(1 * CAST(power(2, 4) AS integer))

-- FIREBIRD
bin_shl(1, 4)

-- H2
lshift(1, 4)

-- ORACLE
(1 * CAST(power(2, 4) AS number(10)))

-- TERADATA
shiftleft(1, 4)

-- ACCESS, DERBY, HANA, INGRES, REDSHIFT
/* UNSUPPORTED */

為了確保您不會意外編寫不適用於某些方言的查詢,您可以:

  1. 運行集成測試,例如在每個目標方言上使用testcontainers
  2. 使用jOOQ 的 Checker Framework 或 ErrorProne 集成進行 static 代碼分析。 另請參閱此處的此博客文章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM