有人能指出一些有关可用于Java的不同Query DSL库之间性能比较的资源,例如: Querydsl , jOOQ < / strong>, JEQUEL , activejdbc , iciql 等......
背景:我使用Spring JDBC模板,但仍然需要以纯字符串格式编写查询。虽然我在编写直接查询时没有问题,但我担心直接依赖于DB表名。我不想使用任何ORM框架,如Hibernate或JPA / EclipseLink。我需要尽可能高的原始性能(IMO,它们适用于更多以CRUD为中心的应用程序)。我可以为这些DSL提供一些轻微的开销,只要它有点(我相信,它主要是StringBuilder / String连接!)
我考虑过在某些xml中使用外部化的命名查询。但只是试图评估不同的Query DSL库提供的价值。
编辑:更多关于我的要求: 在使用API方法构建中等复杂的查询时,我想知道它们之间的性能比较。我需要的是使用任何这些查询DSL库生成查询字符串并将其传递给Spring JDBC模板。所以,我想知道如果添加这个中间步骤会导致相当大的性能损失,我想使用命名查询或构建我自己的库,它只使用StingBuilder或类似的方法
更新 我对jOOQ,iciql,QueryDSL的体验:
虽然我错过了在我的原帖中提到这一点,但我也热衷于易用性和安全性。我需要在我的实体类中拥有的开销(如果需要任何额外的注释或实现)。
jOOQ:
Iciql:
QueryDSL:
(所有观察对我都知之甚少;如果其中任何一个不正确,请更正)
综合以上所述,我坚持编写命名查询:(但由于Lukas Eder的答案似乎解释了我原来的帖子关注(表现),我接受了他的。
答案 0 :(得分:28)
在现代JVM中,你不应该过多担心SQL字符串连接。任何数据库抽象层可能产生的真正开销(与数据库的相对较高的往返时间和返回时间相比)通常是由于二级缓存,这是在Hibernate / JPA中完成的。或者通过使用索引或一般查询转换变得不可能的方式将对象模型低效地映射到SQL。
与此相比,字符串连接实际上可以忽略不计,即使对于包含多个UNIONs
,嵌套SELECTs
,JOINs
,semi-JOINs
,anti-JOINs
的复杂SQL构造也是如此等等,所以我猜你提到的所有框架都以类似的方式执行,因为它们允许你控制你的SQL。
另一方面,这些框架中的一些框架或使用模式实际上可能会将整个结果集提取到内存中。如果结果集很大,这可能会导致问题,也因为使用Java的泛型,大多数原始类型(int
,long
等)可能映射到它们相应的包装器(Integer
,{ {1}})。
对于jOOQ(其中我是开发人员),我之前使用YourKit Profiler对库进行了分析,以执行大量查询。批量工作总是在数据库中完成,而不是在查询构造中完成。 jOOQ对每个查询使用一个Long
。我想(未经验证),QueryDSL和JEQUEL做同样的事情......
至于iciql,它是JaQu的一个分支,可能会有一些额外的影响,因为他们使用Java工具来反编译他们的natural syntax。但我想这可以省略,如果它意味着太大的影响。
答案 1 :(得分:6)
您还应该查看MyBatis Statement Builder。
虽然MyBatis显然是一种映射技术,但它确实有一个Statement构建器DSL似乎与MyBatis分离(你不需要MyBatis中的任何其他东西来使用构建器......令人讨厌的是它不在它自己的jar中)。我不喜欢它,因为它使用ThreadLocals。
答案 2 :(得分:2)
我不能代表其他框架,但我对性能进行了原始分析,以比较ActiveJDBC和Hibernate。测试是在一台笔记本电脑上使用8G RAM,针对MySQL的SSD驱动器。表PEOPLE有几个简单的列和代理ID PK。
一个测试是将50K记录作为对象插入,另一个测试是同时从表中读取50K对象(在内存中)。在两个测试中,ActiveJDBC的性能比Hibernate提高了40%。在任何一种情况下,生成的查询都是简单的插入和选择,彼此非常相似。
希望这有帮助,
伊戈尔答案 3 :(得分:0)
OpenHMS SQL Builder 库是用于编程SQL查询创建的轻量级,无依赖性的库:
https://openhms.sourceforge.io/sqlbuilder/
可作为Maven依赖项:
https://mvnrepository.com/artifact/com.healthmarketscience.sqlbuilder/sqlbuilder