当前位置: 首页 > 面试题库 >

比较Querydsl,jOOQ,JEQUEL,activejdbc,iciql和其他查询DSL

亢保赫
2023-03-14
问题内容

有人可以向我指出一些有关可用于Java的不同查询DSL库之间的性能比较的资源,例如:
Querydsl
jOOQ
JEQUEL
activejdbc
iciql 等。

背景: 我正在使用Spring
JDBC模板,但是仍然需要以纯字符串格式编写查询。尽管我在编写直接查询时没有问题,但是我担心直接依赖于数据库表名。我不想使用任何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,从而无法使用索引或常规查询转换。

与此相比,字符串连接实在是可以忽略不计,甚至对复杂的SQL构造带几个UNIONs,嵌套SELECTsJOINssemi- JOINsanti-JOINs,等,所以我猜你提到类似的方式进行,因为它们允许您通过保持控制框架您的SQL。

另一方面,某些框架或这些框架中的使用模式实际上可能会将整个结果集提取到内存中。可因为Java的泛型,最原始的类型(造成的问题,如果您的结果集都很大,也是intlong等)很可能映射到其相应的包装(IntegerLong)。

至于jOOQ(我是开发者),我之前已经使用YourKit
Profiler对库进行了配置,以进行大量查询。批量工作始终在数据库中完成,而不是在查询构造中完成。jOOQ
StringBuilder为每个查询使用一个。我想象(未经验证),QueryDSL和JEQUEL会做同样的事情…

至于iciql(它是JaQu的分支),由于他们使用Java工具来反编译其自然语法,因此可能会产生一些其他影响。但是我想这可以忽略,如果这意味着太大的影响。



 类似资料:
  • 首先要明确一点的是,没有最好,只有最合适。前端框架并不是所谓 注:本文一些数据收集时间为16-12-31 因为大部分教程都是付费的,所以教程数量的多少在侧面反映了框架的市场需求,如果框架冷门用的人不多,那必然不会有人去为其开发教程。

  • 问题内容: 我想知道如何比较两个不同的数据库 表记录 。我的意思是,我将比较两个数据库表,它们可能具有不同的列名但具有相同的数据。但是其中一个表可能比另一个表具有更多的记录,因此我想看看这两个表之间的区别是什么。为此,如何编写sql查询?仅供参考:这两个数据库都在同一个SQL Server实例下。 然后,在比较表1和表2之后,它应该 从 表2返回 Ruby Core。 问题答案: 如果执行从T1到

  • 二元比较操作可以比较变量或者数量。 需要注意的是,整数和字符串比较使用的是两套不同的操作符。 整数比较 -eq 等于 if [ "$a" -eq "$b" ] -ne 不等于 if [ "$a" -ne "$b" ] -gt 大于 if [ "$a" -gt "$b" ] -ge 大于等于 if [ "$a" -ge "$b" ] -lt 小于 if [ "$a" -lt "$b" ] -le 小

  • AddressTemporal类 我已经将lucene配置为使用字符串常量(“null”)索引空字段,这样我就可以使用该值查询空字段。 我的问题是,我需要执行一个查询,该查询将在集合中搜索,但只筛选那些where字段为空的查询。现在 谢谢 乌利塞斯

  • 我试图执行以下jcr sql2查询: 但是我得到了 是否有其他方法可以搜索名称类似“%example%”的节点? 我还试图搜索具有指定路径的节点 但是我得到了 如何搜索路径类似于'%示例%'的节点? 我在用JCR_SQL2