千家信息网

Hibernate性能问题怎么解决

发表于:2024-11-25 作者:千家信息网编辑
千家信息网最后更新 2024年11月25日,本篇内容主要讲解"Hibernate性能问题怎么解决",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Hibernate性能问题怎么解决"吧!在使用Hiber
千家信息网最后更新 2024年11月25日Hibernate性能问题怎么解决

本篇内容主要讲解"Hibernate性能问题怎么解决",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Hibernate性能问题怎么解决"吧!

在使用Hibernate进行分页的过程中,如果你收到如下警告,那么这里就是一个潜在的Hibernate性能问题点:

WARNING: firstResult/maxResults specified with collection fetch; applying in memory!

出现这个警告的直接后果是:无论你想要看第几页的数据,从Hibernate打印出的SQL来看它总是查询了所有满足条件的结果。这是为什么呢?来看看这句警告所在的代码,它位于org.hibernate.hql.ast.QueryTranslatorImpl中,部分摘录如下:

  1. view plaincopy to clipboardprint?

  2. QueryNode query = ( QueryNode ) sqlAst;

  3. boolean hasLimit = queryParameters.getRowSelection() != null &&
    queryParameters.getRowSelection().definesLimits();

  4. boolean needsDistincting = ( query.getSelectClause().isDistinct() || hasLimit ) &&
    containsCollectionFetches();

  5. QueryParameters queryParametersToUse;

  6. if ( hasLimit && containsCollectionFetches() ) {

  7. log.warn( "firstResult/maxResults specified with collection fetch; applying in memory!" )

  8. RowSelection selection = new RowSelection();

  9. selection.setFetchSize( queryParameters.getRowSelection().getFetchSize() );

  10. selection.setTimeout( queryParameters.getRowSelection().getTimeout() );

  11. queryParametersqueryParametersToUse = queryParameters.createCopyUsing( selection );

  12. }

  13. else {

  14. queryParametersqueryParametersToUse = queryParameters;

  15. }

  16. List results = queryLoader.list( session, queryParametersToUse );

  17. QueryNode query = ( QueryNode ) sqlAst;

  18. boolean hasLimit = queryParameters.getRowSelection() != null &&
    queryParameters.getRowSelection().definesLimits();

  19. boolean needsDistincting = ( query.getSelectClause().isDistinct() || hasLimit ) &&
    containsCollectionFetches();

  20. QueryParameters queryParametersToUse;

  21. if ( hasLimit && containsCollectionFetches() ) {

  22. log.warn( "firstResult/maxResults specified with collection fetch; applying in memory!" );

  23. RowSelection selection = new RowSelection();

  24. selection.setFetchSize( queryParameters.getRowSelection().getFetchSize() );

  25. selection.setTimeout( queryParameters.getRowSelection().getTimeout() );

  26. queryParametersqueryParametersToUse = queryParameters.createCopyUsing( selection );

  27. }

  28. else {

  29. queryParametersqueryParametersToUse = queryParameters;

  30. }

  31. List results = queryLoader.list( session, queryParametersToUse );

关键在于if ( hasLimit && containsCollectionFetches() 这句判断,如果满足了这个条件,RowSelection将会被重新生成,原本分页需要的firstRow和maxRows属性将会丢失,后面的数据库分页自然也无法进行。Hibernate这么做的原因从代码上也很容易理解,如果查询需要限制条数(limit/offset)并且需要fetch结合对象,则重新生成RowSelection,进一步解释,就是当一个实体(A)和另一个实体(B)是One-To-Many关系的时候,一个需要fetch的典型查询语句是"select distinct a from A a left join fetch a.b",由于1个A可能对应多个B,这个时候数据库查询的结果条数和需要生成的A对象的条数可能不一致,所以无法利用数据库层的分页来实现,因为你真正想分页的是A而不是A left join B。出现这个警告就是提醒你这个查询实际上是查询了所有满足条件的数据,Hibernate是在内存中对其进行了假分页的处理。

这样,对于查询结果比较多的情况无疑是一个Hibernate性能上的潜在威胁。碰到这样的情况,将Many的查询进行分开也是一种解决办法。

到此,相信大家对"Hibernate性能问题怎么解决"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

查询 性能 数据 问题 就是 数据库 条件 结果 生成 代码 内容 实体 实际 对象 情况 时候 潜在 学习 实用 更深 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 戴尔服务器硬盘格式化 南昌优师网络技术有限公司 设置戴尔服务器风扇转速 君琳科技互联网有限公司 多数据库连接 java 服务器装win10 云南品质软件开发参考价格 深圳微距互联网科技 服务器管理口怎么用xshell 周跃计算机网络技术 dellt320服务器怎么样 网络安全是动态的不是静态的 网络安全专业火吗 网络安全与执法硕士 开网络技术培训班 软件开发工程师公司实习 ftp服务器应用协议 软件开发信息收集招募调研员 mysql数据库下载教程 服务管理器找不到服务器 登录山东食链显示服务器异常 用户端搜索中国网络安全吗 车牌识别数据库图片python 中国十大网络安全学院 软件开发创业计划书的条件假设 临床路径管理会涉及软件开发吗 人社局的计算机网络安全管理员证 易语言连接服务器删除数据库 为什么会用到打印机服务器 医院网络安全宣传周视频
0