一尘不染

Hibernate命名查询及其性能优势?

hibernate

就像hibernate文档所说的那样,命名查询的目的是将HQL从项目中的不同位置清除到某个xml中的单个位置(在声明方法的情况下),这意味着在查询修改的情况下不需要重新编译,而是重新加载会话工厂这是必需的,这意味着在大多数情况下,由于查询对象被缓存,服务器将启动。但是在注释的情况下,我需要在实体级别定义命名查询。因此,这里再次需要编译。我的问题是命名查询在性能上是否也有帮助。这是我的理解:

1)当我使用命名查询时,只是查询对象被缓存在第二级缓存中。当我说只是查询对象时,这意味着只缓存查询语法而不是查询结果。如果它的权利是正确的,那么可能仅在HQL的情况下才有用,因为那可以避免将HQL转换为本机查询,因此每次触发的查询都会具有良好的时间性能。

但是,如果我们使用本机sql,则命名查询不会提供这种优势,因为在这种情况下不会进行翻译。

因此,命名查询的主要优势是建立sql的中央存储库。是的,在HQL的情况下,它还可以为我们节省到本地sql的翻译时间,但是请记住,查询对象将占用jvm的生命周期,并且会占用一些内存。所以这里要折衷。


阅读 177

收藏
2020-06-20

共1个答案

一尘不染

命名查询有两个小优点:

  • 创建会话工厂时将检查其语法,从而使应用程序在出现错误的情况下快速失败(这可能表明您的应用程序缺少某些单元测试)
  • 可以从多个位置访问和使用它们(无论如何这可能表示存在设计问题)

它们还有一个缺点:使用命名查询读取或调试代码时,如果不搜索其定义就无法立即查看正在执行哪个查询。

其余的实际上并不重要:

  • 与实际执行查询的成本相比,将HQL查询转换为SQL的成本可以忽略不计
  • 缓存查询的内存成本确实很小。请记住,Hibernate无论如何都需要在内存中存储所有实体元数据。

我倾向于在使用查询的代码中定义查询,并对它们进行单元测试。这使代码更易读,更健壮。

2020-06-20