在多线程环境中,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查询语法总结 Hibernate hql查询语法总结
Hibernate HQL基础练习小列子+数据库
Hibernate HQL.txt Hibernate HQL.txt Hibernate HQL.txt
Hibernate中的关联查询实际上生成的是数据库表连接查询的SQL语句
对hibernate的hql进行了详尽的讲解
hibernate查询之HQLhibernate查询之HQLhibernate查询之HQL
Hibernate HQL.docHibernate HQL.docHibernate HQL.doc
Hibernate HQL 深度历险 深入讲解Hibernate HQL 查询
hibernate hql基本操作
一个关于Hibernate-HQL 的文档 内容实际而且实用
hibernate hql各类查询范例
hibernate-HQL语句大全
Hibernate查询语言HQL.PPT
Hibernate HQL查询 分页查询 模糊查询.docxHibernate HQL查询 分页查询 模糊查询.docxHibernate HQL查询 分页查询 模糊查询.docxHibernate HQL查询 分页查询 模糊查询.docxHibernate HQL查询 分页查询 模糊查询....
Hibernate HQL命名参数和Query接口的分页 Hibernate HQL命名参数和Query接口的分页
weblogic12 下最新 org.hibernate.hql.ast.HqlToken解决办法
hibernate hql 语言大全 hql学习,这个文档是一个很全面,很不错的
Hibernate HQL 插入,查询,更新
hibernate持久化,hql查询 关联映射
精通HQL.doc精通HQL.doc精通HQL.doc精通HQL.doc精通HQL.doc