在多线程环境中,hibernate把hql转换为sql时,会频繁的调用classloader中的方法来加载class。在某些中间件中(例如tomcat),classloader在加载class时,是同步操作。这种组合大大降低了应用程序的性能。
相关文章
https://hibernate.atlassian.net/browse/HHH-10746
https://hibernate.atlassian.net/browse/HHH-4959
在hibernate 5.2.6版中,修改了这个问题,增加了配置
hibernate.query.conventional_java_constants
默认值为true,即在hql中不支持java常量的引用
例如:
from Table t where t.c_bh=com.xxx.Table.N_XXX
不会尝试解析“t.c_bh”,但是会尝试解析“com.xxx.Table.N_XXX”
之前版本的hibernate,在hql中碰到“xx.xx”时,都会调用classloader来尝试加载类,这个会导致classloader加载很多不存在的类(调用开销大),这是导致性能下降的原因。
堆栈1:
at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:390) - waiting to lock <0x00000007315a3870> (a org.eclipse.jetty.webapp.WebAppClassLoader) at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:383) at org.hibernate.util.ReflectHelper.classForName(ReflectHelper.java:95) at org.hibernate.util.ReflectHelper.getConstantValue(ReflectHelper.java:122) at org.hibernate.hql.ast.QueryTranslatorImpl$JavaConstantConverter.handleDotStructure(QueryTranslatorImpl.java:569) at org.hibernate.hql.ast.QueryTranslatorImpl$JavaConstantConverter.visit(QueryTranslatorImpl.java:564) at org.hibernate.hql.ast.util.NodeTraverser.visitDepthFirst(NodeTraverser.java:40) at org.hibernate.hql.ast.util.NodeTraverser.visitDepthFirst(NodeTraverser.java:42) at org.hibernate.hql.ast.util.NodeTraverser.visitDepthFirst(NodeTraverser.java:42) at org.hibernate.hql.ast.util.NodeTraverser.visitDepthFirst(NodeTraverser.java:41) at org.hibernate.hql.ast.util.NodeTraverser.visitDepthFirst(NodeTraverser.java:42) at org.hibernate.hql.ast.util.NodeTraverser.visitDepthFirst(NodeTraverser.java:41)
堆栈2:
at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:171) at org.hibernate.util.ReflectHelper.classForName(ReflectHelper.java:100) at org.hibernate.util.ReflectHelper.getConstantValue(ReflectHelper.java:122) at org.hibernate.hql.ast.QueryTranslatorImpl$JavaConstantConverter.handleDotStructure(QueryTranslatorImpl.java:569) at org.hibernate.hql.ast.QueryTranslatorImpl$JavaConstantConverter.visit(QueryTranslatorImpl.java:564) at org.hibernate.hql.ast.util.NodeTraverser.visitDepthFirst(NodeTraverser.java:40) at org.hibernate.hql.ast.util.NodeTraverser.visitDepthFirst(NodeTraverser.java:41) at org.hibernate.hql.ast.util.NodeTraverser.visitDepthFirst(NodeTraverser.java:41) at org.hibernate.hql.ast.util.NodeTraverser.visitDepthFirst(NodeTraverser.java:41) at org.hibernate.hql.ast.util.NodeTraverser.traverseDepthFirst(NodeTraverser.java:33) at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:254) at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:157)
相关推荐
总的来说,Hibernate-HQL是Java开发中处理数据库操作的重要工具,它简化了数据库操作,提高了开发效率。深入学习和理解HQL,能够帮助开发者更好地利用Hibernate框架,构建高效且易于维护的Java应用。
**描述解析:**虽然描述为空,但根据标题可以推测这篇博客可能详细讲解了如何使用Hibernate的主要API进行数据操作,并且涉及到了Hibernate配置文件中的常量设置,这些设置对于优化性能和确保正确性至关重要。...
Hibernate是一款开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的编程方式来操作数据库,极大地简化了Java应用程序与数据库之间的交互。这个压缩包包含的资源是Hibernate的中英文API文档,以及一些指南,...
标题 "使用模式设计及java5新特性在HibernateDAO中的应用" 涉及到的是软件开发中的几个关键概念,包括模式设计、Java 5的新特性以及它们如何在Hibernate DAO层中得到应用。在这个主题中,我们将深入探讨这些知识点,...
在Hibernate源码中,可能会包含版本信息、许可证信息等。 通过阅读和研究这些源码,开发者可以深入理解Hibernate如何进行对象持久化、事务管理、查询优化等核心功能,这对于提升Java开发者的ORM技能,尤其是数据库...
在Hibernate 5.3.1版本中,引入了对Java Persistence API (JPA) 2.2的支持,进一步增强了其功能和灵活性。JPA 2.2提供了更丰富的查询语言(JPQL)和更多的元数据注解,使得数据库操作更为简便。 Hibernate 5.3.1 ...
在大量数据展示时,分页可以避免一次性加载过多内容导致的性能问题。通常,分页是通过设置每页显示的数量和当前页码来实现的。在Struts中,可以通过传递参数来控制这些值,而Hibernate则可以配合使用`setFirstResult...
Hibernate5引入了新的特性,如批处理更新、HQL改进等,提高了性能和灵活性。 整合Struts2、Spring4和Hibernate5,通常遵循以下步骤: 1. **配置环境**:确保项目中包含这三个框架的库文件,并在pom.xml或build....
这部分定义了查询语言的常量和函数名,对于使用Hibernate HQL(Hibernate Query Language)进行查询非常重要。 - **hibernate.query.substitutions**:用于替换查询中的某些值。例如,在这里设置`yes`和`no`的对应...
通过深入学习这些文档,开发者可以熟练掌握Hibernate的核心概念,如Session、Transaction、Criteria查询、HQL(Hibernate Query Language)、Entity、Collection Mapping等,从而在实际开发中更加高效地操作数据库。...
在Java中使用HQL 709 内容总结 712 独立实践 712 第三十七章 Spring介绍 713 学习目标 713 Spring简介 714 IOC控制反转 714 Spring的容器 715 AOP面向切面编程 715 AOP的专业术语 715 Spring事务管理 718 Spring与...
在Java开发环境中,Hibernate作为一款优秀的对象关系映射(ORM)框架,在简化数据库操作、提高开发效率方面发挥着重要作用。而`hibernate.properties`文件则是Hibernate框架的核心配置文件之一,用于定义数据库连接...
SSH框架,全称为Struts2、Spring和Hibernate的组合,是Java Web开发中常见的三大开源框架集成。它们分别负责Web层、服务层和持久层的管理,构建出高效、灵活的企业级应用程序。 Struts2是MVC(Model-View-...
Java开发工程师面试题通常涉及到Java语言的核心特性、集合框架、多线程、设计模式、ORM框架如Hibernate、以及Web开发中的MVC架构和框架如Struts。以下是对这些知识点的详细解释: 1. `final`、`finally`、`finalize...
在IT行业中,J2EE(Java 2 Platform, Enterprise Edition)是企业级应用程序开发的基石,它提供了一套规范和API,使得开发者可以构建可扩展、安全且事务处理能力强大的多层分布式应用。本资源主要关注的是J2EE相关的...
- HQL和Criteria查询支持分页、排序、聚合函数,能更好地避免N+1查询问题。 - `join fetch`可以显式执行连接查询,避免多次查询。 - 使用`@BatchSize`指定批处理大小,提高批量读取效率。 8. **元数据信息** - ...
ORM规约:对象关系映射(ORM)规约涉及使用Java中的ORM框架(如Hibernate)的规范,包括实体类映射和查询语言(如HQL)的使用。 四、工程规约 应用分层:应用分层规约对应用程序的架构分层提出指导,包括不同层次...
Struts2、Hibernate和Spring是Java开发中常用的三大框架,它们各自负责Web应用程序的不同层面:Struts2负责表现层管理,Hibernate处理数据持久化,而Spring则提供了全面的依赖注入和面向切面编程功能,以及对其他...
- **HQL**:Hibernate Query Language,用于查询对象的查询语言。 #### 十七、Spring - **IOC/DI**:Inversion of Control/Dependency Injection,控制反转/依赖注入,用于解耦组件间的依赖关系。 - **AOP**:...
Struts、Hibernate和Spring是Java开发中常用的三个开源框架,它们各自负责Web应用程序的不同层面,组合使用能够构建出高效、可维护的系统。Struts1是MVC(Model-View-Controller)架构的实现,主要处理请求和视图的...