簡體   English   中英

比較Querydsl,jOOQ,JEQUEL,activejdbc,iciql和其他查詢DSL

[英]Comparing Querydsl, jOOQ, JEQUEL, activejdbc, iciql and other query DSLs

有人能指出一些關於可用於Java的不同Query DSL庫之間性能比較的資源,如: QuerydsljOOQJEQUELactivejdbciciql等等......

背景:我使用Spring JDBC模板,但仍然需要以純字符串格式編寫查詢。 雖然我在編寫直接查詢時沒有問題,但我擔心直接依賴於DB表名。 我不想使用任何ORM框架,如Hibernate或JPA / EclipseLink。 我需要盡可能高的原始性能(IMO,它們適用於更多以CRUD為中心的應用程序)。 我可以為這些DSL提供一些輕微的開銷,只要它有點(我相信,它主要是StringBuilder / String連接!)

我考慮過在某些xml中使用外部化的命名查詢。 但只是試圖評估不同的Query DSL庫提供的價值。

編輯:更多關於我的要求:我想知道使用他們的API方法構建中等復雜查詢時這些之間的性能比較。 我需要的是使用任何這些查詢DSL庫生成查詢字符串並將其傳遞給Spring JDBC模板。 所以,我想知道如果添加這個中間步驟會導致相當大的性能損失,我想使用命名查詢或構建我自己的庫,它只使用StingBuilder或類似的方法

用jOOQ,iciql,QueryDSL 更新我的經驗:

雖然我錯過了在我的原帖中提到這一點,但我也熱衷於易用性和我在實體類中需要的開銷(如果需要任何額外的注釋或實現)。

jOOQ:

  • 需要將實體屬性更改為特定於庫的方式
  • 可以返回SQL查詢字符串

Iciql:

  • 實體可以映射到沒有或很少的變化(可以使用總共3種方式映射)
  • 但由此限制只選擇查詢(更新/刪除/ ...再次要求實體更改)

QueryDSL:

  • 使用表綁定實體的多種方法(支持使用JPA注釋的庫特定方式除外)。 但我們至少需要修改實體
  • 沒有簡單/直接的方式來獲取查詢字符串

(所有觀察對我都知之甚少;如果其中任何一個不正確,請更正)

綜上所述,我堅持編寫命名查詢:(但由於Lukas Eder的答案似乎解釋了我原來的帖子關注(表現),我接受了他的。

在現代JVM中,你不應該過多擔心SQL字符串連接。 任何數據庫抽象層可能產生的真正開銷(與數據庫的相對較高的往返時間和返回時間相比)通常是由於二級緩存,這是在Hibernate / JPA中完成的。 或者通過使用索引或一般查詢轉換變得不可能的方式將對象模型無效地映射到SQL。

與此相比,字符串連接實際上可以忽略不計,即使對於具有多個UNIONs ,嵌套SELECTsJOINssemi-JOINsanti-JOINs等的復雜SQL構造,所以我猜測你提到的所有框架都以類似的方式執行,因為它們允許您保持對SQL的控制。

另一方面,這些框架中的一些框架或使用模式實際上可能將整個結果集提取到內存中。 如果結果集很大,這可能會導致問題,也因為使用Java的泛型,大多數原始類型( intlong等)可能映射到它們相應的包裝器( IntegerLong )。

至於jOOQ (其中我是開發人員),我之前使用YourKit Profiler對該庫進行了分析,以執行大量查詢。 批量工作總是在數據庫中完成,而不是在查詢構造中完成。 jOOQ為每個查詢使用單個StringBuilder 我想(沒有驗證), QueryDSLJEQUEL做同樣的事......

至於iciql ,這是一個叉JaQu ,有可能是由他們使用Java的儀器進行反編譯的事實一些額外的影響自然的語法 但我想這可以省略,如果它意味着太大的影響。

您還應該查看MyBatis Statement Builder

雖然MyBatis顯然是一種映射技術,但它確實有一個Statement構建器DSL,它似乎與MyBatis分離(即你不需要MyBatis的任何其他東西來使用構建器......令人討厭的是它不在它自己的jar中)。 我不喜歡它,因為它使用ThreadLocals。

我不能代表其他框架,但我對性能進行了原始分析,以比較ActiveJDBC和Hibernate。 測試是在一台筆記本電腦上使用8G RAM,針對MySQL的SSD驅動器。 表PEOPLE有幾個簡單的列和代理ID PK。

一個測試是將50K記錄作為對象插入,另一個測試是同時從表中讀取50K對象(在內存中)。 在兩個測試中,ActiveJDBC的性能比Hibernate提高了40%。 在任何一種情況下,生成的查詢都是簡單的插入和選擇,彼此非常相似。

希望這可以幫助,

伊戈爾

用於編程SQL查詢創建的輕量級 ,無依賴性庫是OpenHMS SQL Builder庫:

https://openhms.sourceforge.io/sqlbuilder/

可用作Maven依賴:

https://mvnrepository.com/artifact/com.healthmarketscience.sqlbuilder/sqlbuilder

暫無
暫無

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

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