`
asd8313123
  • 浏览: 18974 次
  • 性别: Icon_minigender_1
  • 来自: 韶关
社区版块
存档分类
最新评论

(转) firstResult/maxResults specified with collection fetch; applying in memory!

    博客分类:
  • java
阅读更多

之前遇到了同样的问题。记录一下:

 

 

 

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

----------------------------------------

hxzon:使用了join fetch p.items导致这个警告。

----------------------------------------

学习Hibernate时,经常会遇到Hibernate性能问题,这里将介绍Hibernate性能问题的解决方法。

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

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

出现这个警告的直接后果是:无论你想要看第几页的数据,从Hibernate打印出的SQL来看它总是查询了所有满足条件的结果。这是为什么呢?来看看这 句警告所在的代码,它位于org.hibernate.hql.ast.QueryTranslatorImpl.list中。
public List list(SessionImplementor session, QueryParameters queryParameters)   throws HibernateException {  // Delegate to the QueryLoader...  errorIfDML();  QueryNode query = ( QueryNode ) sqlAst;  boolean hasLimit = queryParameters.getRowSelection() != null && queryParameters.getRowSelection().definesLimits();  boolean needsDistincting = ( query.getSelectClause().isDistinct() || hasLimit ) && containsCollectionFetches();  QueryParameters queryParametersToUse;  if ( hasLimit && containsCollectionFetches() ) {   log.warn( "firstResult/maxResults specified with collection fetch; applying in memory!" );   RowSelection selection = new RowSelection();   selection.setFetchSize( queryParameters.getRowSelection().getFetchSize() );   selection.setTimeout( queryParameters.getRowSelection().getTimeout() );   queryParametersToUse = queryParameters.createCopyUsing( selection );  }  else {   queryParametersToUse = queryParameters;  }  List results = queryLoader.list( session, queryParametersToUse );  if ( needsDistincting ) {   int includedCount = -1;   // NOTE : firstRow is zero-based   int first = !hasLimit || queryParameters.getRowSelection().getFirstRow() == null      ? 0      : queryParameters.getRowSelection().getFirstRow().intValue();   int max = !hasLimit || queryParameters.getRowSelection().getMaxRows() == null      ? -1      : queryParameters.getRowSelection().getMaxRows().intValue();   int size = results.size();   List tmp = new ArrayList();   IdentitySet distinction = new IdentitySet();   for ( int i = 0; i < size; i++ ) {    final Object result = results.get( i );    if ( !distinction.add( result ) ) {     continue;    }    includedCount++;    if ( includedCount < first ) {     continue;    }    tmp.add( result );    // NOTE : ( max - 1 ) because first is zero-based while max is not...    if ( max >= 0 && ( includedCount - first ) >= ( max - 1 ) ) {     break;    }   }   results = tmp;  }  return results; }关键在于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中实现真分页和假分页技术

    在Java的持久化框架Hibernate中,分页查询是常见的需求,它可以帮助我们有效地管理大量数据,提高系统的性能。本文将详细讲解如何在Hibernate中实现真分页(物理分页)和假分页(逻辑分页)。 ...

    Hibernate分页可能引起的性能问题

    Hibernate分页可能引起的性能问题 在使用Hibernate进行分页的过程中,如果你收到如下警告,那么这里就是一个潜在的性能问题...WARNING: firstResult/maxResults specified with collection fetch; applying in memory!

    很好用性能高的一个分页查询

    很实用值得借鉴的一个分页例子,性能高,只需要传你要的参数就可以实用了

    Hibernate性能调优

    4. 分页查询时,使用LIMIT或FirstResult/MaxResults避免大量数据加载。 四、缓存策略 1. 第一级缓存:SessionFactory级别的缓存,默认开启,无需额外配置。控制好实体的状态管理,避免脏数据。 2. 第二级缓存:可...

    Hibernate 多表连接分页查询示范项目

    Hibernate 提供了 ScrollableResults 和 FirstResult/MaxResults 方法来实现分页。ScrollableResults 允许按需加载结果集,避免一次性加载大量数据造成内存压力;FirstResult 设置起始行,MaxResults 设置每页的最大...

    hibernate常用的模板方法

    `findByExample()` 返回所有符合条件的对象,而 `findByExample(..., firstResult, maxResults)` 可以指定返回结果的起始位置和最大数量,实现分页查询。 4. `findByNamedParam(String queryString, String param...

    ssh框架实现分页

    例如,通过设置FirstResult和MaxResults属性来指定查询的起始位置和记录数量,从而实现分页效果。 在实际的项目结构中,`accp_page`可能包含以下几个关键部分: 1. **Action类**:定义了处理用户请求的方法,如`...

    hibernate分页查询

    Hibernate分页查询基于SQL的LIMIT和OFFSET子句,通过Session的createQuery或createSQLQuery方法创建查询,并设置FirstResult和MaxResults属性来实现分页。FirstResult表示从结果集的第几个元素开始获取,MaxResults...

    hibernate-hql 资料大全

    参数firstResult和maxResults分别指定查询结果的起始位置和最大数量。 6. **findByNamedParam(String queryString, String paramName, Object value)**: 这种方法使用命名参数进行查询,提供更好的可读性。例如,...

    gethibernatetemplate的find方法

    findByExample(Object exampleEntity, int firstResult, int maxResults);findByNamedParam(String queryString , String paramName , Object value);findByNamedParam(String queryString , String[] paramName ,...

    NHibernate 实例

    5. 分页与排序:通过设置Query的FirstResult和MaxResults属性实现分页,OrderBy方法进行排序。 NHibarnate_Library可能是包含示例代码、配置文件或教程文档的资源包。这些文件可以帮助你理解如何配置NHibernate,...

    hibernate分页

    1. **设置FirstResult和MaxResults**: `Criteria` API 提供了`setFirstResult(int firstResult)`和`setMaxResults(int maxResults)`方法来实现分页。`firstResult`表示查询结果的起始位置,`maxResults`表示每页显示...

    Extjs+Spring+Hibernate实现分页

    在分页场景中,Hibernate的Criteria、Query或HQL语言可以配合FirstResult和MaxResults方法实现分页查询。另外,Hibernate的Criteria API允许我们动态构建查询条件,从而适应不同情况下的分页需求。 在“xxrlmis项目...

    Hibernate 高级特性

    1. 分页查询:通过设置FirstResult和MaxResults参数,实现分页查询,减少不必要的数据传输。 2. HQL与SQL的选择:HQL(Hibernate Query Language)提供了面向对象的查询方式,而原生SQL更适合复杂查询,根据需求灵活...

    ssh2框架带有分页tomcat

    Hibernate提供了分页查询的功能,通过设置FirstResult和MaxResults属性,可以直接完成数据库的分页操作。 描述中的“复制写个sql就能用”意味着在实际开发中,开发者可能只需要编写一个SQL查询,结合Hibernate的API...

    Java实现简单的分页功能

    需要注意的是,不同的数据库可能有不同的分页语法,例如Oracle使用`ROWNUM`,SQL Server使用`OFFSET/FETCH`。在实际应用中,需要根据所使用的数据库调整分页查询的实现。 总结来说,Java实现分页功能的关键在于创建...

    ssh增删改查

    通常需要设置页码和每页大小,然后结合SQL的LIMIT和OFFSET或使用HQL的firstResult和maxResults来实现。 4. 排序查询:可以按照指定字段进行升序或降序排序。 SSH框架中的分页实现: 1. 通过前端传递页码和每页大小...

    SSH分页完整实例

    在分页查询时,Hibernate提供了一些API,如Criteria、HQL(Hibernate Query Language)或SQL,通过设置Query的FirstResult和MaxResults属性来实现分页。 分页的实现通常包括以下几个步骤: 1. **前端请求**:用户...

    自己做的一个s2sh的整合,实现基本操作

    Hibernate提供了Criteria、HQL以及Query接口的分页功能,开发者可以通过设置firstResult和maxResults参数实现这一目标。 3. **登录与注册**:这是任何有用户管理系统的Web应用的基础。登录通常涉及用户凭证的验证,...

    struts+hibernate 分页实例

    在Hibernate中,实现分页主要涉及两个关键参数:`firstResult`和`maxResults`。`firstResult`定义了查询开始的位置,`maxResults`限制了返回结果的数量。这样,我们可以通过改变这两个参数实现数据的不同页面。例如...

Global site tag (gtag.js) - Google Analytics