草庐IT

java - 比较 Querydsl、jOOQ、JEQUEL、activejdbc、iciql 和其他查询 DSL

coder 2023-05-15 原文

谁能给我一些关于可用于 Java 的不同 Query DSL 库之间性能比较的资源,例如: Querydsl , jOOQ , JEQUEL , activejdbc , iciql 等等……

背景: 我正在使用 Spring JDBC 模板,但这仍然需要以纯字符串格式编写查询。虽然我在编写直接查询时没有问题,但我担心直接依赖于数据库表名。我不想使用任何 ORM 框架,如 Hibernate 或 JPA/EclipseLink。我需要尽可能高的原始性能(IMO,它们适用于更多以 CRUD 为中心的应用程序)。我可以为这些 DSL 提供一点点开销(我相信,它主要是 StringBuilder/String 连接!)

我考虑过在某些 xml 中使用外部化的命名查询。但只是尝试评估不同 Query DSL 库提供的值(value)。

编辑:更多关于我的要求: 我想知道在使用它们的 API 方法构建一个中等复杂的查询时它们之间的性能比较。我只需要使用这些查询 DSL 库中的任何一个生成查询字符串,并将其传递给 Spring JDBC 模板。所以,我想知道添加这个中间步骤是否会导致相当大的性能损失,我想使用命名查询或构建我自己的库,它只使用 StingBuilder 或类似方法

更新我对 jOOQ、iciql、QueryDSL 的体验:

虽然我在原始帖子中没有提及这一点,但我也很喜欢我的实体类中需要的易用性和开销(比如是否需要任何额外的注释或实现)。

jOOQ:

  • 需要将实体属性更改为特定于库的方式
  • 可以返回 SQL 查询字符串

Iciql:

  • 实体可以在没有或很少更改的情况下进行映射(总共可以使用 3 种方式进行映射)
  • 但它仅限于选择查询(更新/删除/...需要再次更改实体)

查询DSL:

  • 多种方式将实体与表绑定(bind)(除了库特定的方式,支持使用 JPA 注释)。但我们至少需要修改实体
  • 没有简单/直接的方式来获取查询字符串

(所有观察都是我对这些知之甚少;如果其中任何一个不正确,请更正)

综上所述,我坚持编写命名查询 :( 但正如 Lukas Eder 的回答似乎解释了我最初的帖子关注点(性能),我接受了他的。

最佳答案

在现代 JVM 中,您不必过多担心 SQL 字符串连接。任何数据库抽象层可能产生的真正开销(与到数据库和返回的相对较高的往返时间相比)通常是由于二级缓存,这是在 Hibernate/JPA 中完成的。或者通过使用索引或一般查询转换变得不可能的方式将对象模型映射到 SQL 的效率低下。

与此相比,字符串连接真的可以忽略不计,即使对于具有多个 UNIONs、嵌套 SELECTsJOINs 的复杂 SQL 构造也是如此>semi-JOINsanti-JOINs 等,所以我猜你提到的所有框架都以类似的方式执行,因为它们允许你保持对 SQL 的控制。

另一方面,某些框架或这些框架中的使用模式实际上可能会将整个结果集提取到内存中。如果您的结果集很大,这可能会导致问题,还因为使用 Java 的泛型,大多数原始类型(intlong 等)可能映射到它们相应的包装器(Integer, Long).

至于jOOQ (我是其中的开发人员),我之前使用 YourKit Profiler 对库进行了概要分析。用于大规模查询执行。批量工作总是在数据库中完成,而不是在查询构造中。 jOOQ 对每个查询使用单个 StringBuilder。我想(未验证)QueryDSLJEQUEL做同样的事情......

至于iciql ,它是 JaQu 的一个分支,由于他们使用 Java 工具来反编译他们的 natural syntax,这可能会产生一些额外的影响。 .但我想这可以省略,如果它意味着太大的影响。

关于java - 比较 Querydsl、jOOQ、JEQUEL、activejdbc、iciql 和其他查询 DSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7242388/

有关java - 比较 Querydsl、jOOQ、JEQUEL、activejdbc、iciql 和其他查询 DSL的更多相关文章

  1. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  2. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  3. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  4. ruby - Ruby 的 Hash 在比较键时使用哪种相等性测试? - 2

    我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。

  5. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  6. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  7. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  8. ruby - 调用其他方法的 TDD 方法的正确方法 - 2

    我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent

  9. ruby - 如何在 Ruby 中创建无类 DSL? - 2

    我正在尝试找出如何为我的Ruby项目创建一种“无类DSL”,类似于在Cucumber步骤定义文件中定义步骤定义或在Sinatra应用程序中定义路由。例如,我想要一个文件,其中调用了我的所有DSL函数:#sample.rbwhen_string_matches/hello(.+)/do|name|call_another_method(name)end我认为用我的项目特有的一堆方法污染全局(内核)命名空间是一种不好的做法。因此方法when_string_matches和call_another_method将在我的库中定义,并且sample.rb文件将以某种方式在我的DSL方法的上下文中

  10. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

随机推荐