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

Java Hibernate命名查询及其性能优势?,java,hibernate,Java,Hibernate,正如hibernate文档所述,命名查询的目的是将HQL从项目中的不同位置清除到某些xml中的单个位置(在声明性方法的情况下)。这意味着在查询修改的情况下不需要重新编译,但需要重新加载会话工厂,这意味着在大多数情况下,在缓存查询对象时服务器会启动。但是在注释的情况下,我需要在实体级别定义命名查询。所以这里再次需要编译。我这里的问题是命名查询是否也有助于提高性能。以下是我的理解:- 1) 当我使用命名查询时,只有查询对象被缓存在二级缓存中。当我说只是查询对象时,它意味着只是缓存查询语法,而不是缓存

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

1) 当我使用命名查询时,只有查询对象被缓存在二级缓存中。当我说只是查询对象时,它意味着只是缓存查询语法,而不是缓存查询结果。对吗?如果它是正确的,那么它可能只在HQL的情况下有用,因为在HQL的情况下,我们可以避免将HQL转换为本机查询,每次启动查询时都会有一些良好的时间性能

但是,如果我们使用本机sql,命名查询并不能提供这种优势,因为在这种情况下不会发生转换


所以,命名查询的主要优点是使SQL成为中央存储库。是的,在HQL的情况下,它也可以为我们节省一些转换为本机sql的时间,但请记住,查询对象将在jvm的生命周期内存在,并将消耗一些内存。因此,在这里进行一些权衡。

命名查询有两个小优点:

  • 在创建会话工厂时,会检查它们的语法,从而使应用程序在出现错误时快速失败(这可能表明您的应用程序缺少一些单元测试)
  • 它们可以从多个地方访问和使用(这可能表明存在设计问题)
它们还有一个缺点:当使用命名查询读取或调试代码时,如果不搜索其定义,您无法立即看到正在执行的查询

剩下的其实并不重要:

  • 与实际执行查询的成本相比,将HQL查询转换为SQL的成本可以忽略不计
  • 缓存查询的内存开销非常小。请记住,Hibernate无论如何都需要将所有实体元数据存储在内存中
我倾向于在使用查询的代码中定义查询,并对其进行单元测试。这使代码更可读、更健壮。

正如您所说的“它们可以从多个地方访问和使用(这可能表明存在设计问题),这可以通过在接口或公共静态常量中定义查询来完成。看来主要的小优势是你们提到的第一点