- 浏览: 153432 次
- 性别:
- 来自: 大连
文章分类
最新评论
-
fddjxllren:
session.find()是不支持动态绑定参数的.要使用it ...
Hibernate查询之list/iterator -
xiaofeiyang:
http://svn.apache.org/repos/asf ...
struts,hibernate,spring 版本控制svn的URL地址 -
peterxiemin:
emp在建立的时候,报无效的月份,为什么 ?
oracle的练习表---employee -
java_bigniu:
...
Hibernate查询之list/iterator -
lanhai921:
学习下,谢谢分享。
itext基本用法
在Hibernate3中将Session.find(),Session.iterator()换成:session.createQuery().list(),session.creqteQuery().iterator(),(实现机制并没有什么区别);
两者都是根据指定条件查询并返回符合查询的条件的实体对象;
看下session.createQuery().list():
List<TUser> users = session.createQuery(hql).list(); int len = users.size(); for (int i = 0; i < len; i++) { TUser user = users.get(i); System.out.println("User name:"+user.getName()); }
在控制台上只会输出:
Hibernate: select tuser0_.userid as userid0_, tuser0_.name as name0_,tuser0_.age as age0_, tuser0_.info as info0_ from t_user tuser0_ where tuser0_.age>316
显示的结果为:
User name:keith 299
在看下session.createQuery().iterate():
Iterator it = session.createQuery(hql).iterate(); while (it.hasNext()) { TUser users = (TUser) it.next(); System.out.println("user Name:"+users.getName()); }
看下控制台上的输出:
Hibernate: select tuser0_.userid as col_0_0_ from t_user tuser0_ where tuser0_.age>316 Hibernate: select tuser0_.userid as userid0_0_,tuser0_.name as name0_0_, tuser0_.age as age0_0_,tuser0_.info as info0_0_ from t_user tuser0_ where tuser0_.userid=?
所显示的结果为:
user Name:keith 299
两者相比较,list()只发一条语句将符合条件的数据全部查出,而iterator()却现将id查出来,然后根据id再将符合条件的数据查出,这就构成了N+1的问题;既然list更高效,为什么hibernate还将iterator存在呢?
这个问题与Hibernate缓存机制密切相关,我们将两种方法写在一起:
List<TUser> users = session.createQuery(hql).list(); int len = users.size(); for (int i = 0; i < len; i++) { TUser user = users.get(i); System.out.println("user Name:"+user.getName()); } System.out.println("\n query by list is Over,and query by iterator is start..."); Iterator it = session.createQuery(hql).iterate(); while (it.hasNext()) { TUser user = (TUser) it.next(); System.out.println("users name:"+user.getName()); }
看下控制台的输出:
Hibernate: select tuser0_.userid as userid0_,tuser0_.name as name0_,tuser0_.age as age0_,tuser0_.info as info0_ from t_user tuser0_ where tuser0_.age>316 user Name:keith 299 query by list is Over,and query by iterator is start... Hibernate: select tuser0_.userid as col_0_0_ from t_user tuser0_ where tuser0_.age>316 users name:keith 299
只是将之前的list()和iterator()放在一起使用,这时的iterator只执行了一条SQL;其中的差异在于hibernate的缓存机制;
list()方法将执行Select SQL从数据库中获取所有符合满足条件的记录并构造相应的实体对象,实体对象构建完毕后,就将其纳入缓存;
这样等到iterator()执行时,首先会执行一条SQL来查询符合条件数据的id,随即,iterator方法首先在本地缓存内根据id查找对应的实体对象是否存在,如果缓存中已经存在对应的数据,则直接以此数据对象作为查询结果;如果没有找到,则再次执行Select语句获得对应数据库中的表记录(如果iterator在数据库中查到并构建了完整的数据对象,也会将其纳入缓存中);
在上面这个实例中,list()将读取的数据放入缓存中,iterator()直接可以用于是出现了以上的结果;
当我们再次执行上面的程序,发现结果还是一样的;list()并没有去读取它自己放进缓存的数据,因为当我们list()查询完后,即使缓存中有一些符合条件的数据,但是我们也无法保证这些数据就是合法的,如果更改下条件,将大于316改成300;那么缓存中的数据只满足大于316不会满足大于300;所有list()方法还是需要执行一次Select SQL来保证结果的完整性;得出结论:list()实际上无法利用缓存,它对缓存只写不读,而iterator()可以充分利用缓存,如果目标数据只读或者读取相当频繁,可以使用iterator()来减少性能上的消耗;
但是会出现这样一个问题,如果是海量数据怎么办?如果超过10万条记录的话,会有很大的可能出发OutOfMemoryError;导致系统异常;那么就用iterator()和evict()来解决吧!将内存消耗保持在可以接受的范围内;比如:
Iterator it = session.createQuery(hql).iterate(); while (it.hasNext()) { TUser users = (TUser) it.next(); //在一级缓存中清理 session.evict(users); //在二级缓存中清理,二级缓存可以设定 SessionFactory.evict(TUser.class, users.getUserid()); System.out.println("user Name:"+users.getName()); }
但是这样的话,由于JVM的异步内存回收机制,无效对象会不断的在内存中积累等待回收,如果数据量很大,必然会频繁的激发JVM的内存回收机制,导致系统性能急剧下降。因此对于这样的问题,最好使用SQL或者存储过程!
评论
发表评论
-
Hibernate之分页
2011-01-09 17:30 903在Hibernate中,通过对不同数据库的统一接口设计,实现了 ... -
hibernate之结果集排序
2011-01-09 17:07 1339无序集和有序集,是针对hibernate数据持久过程中,是否保 ... -
hibernate之Collection类型
2011-01-09 16:42 1443Collection类型: ... -
Hibernate之海量数据操作
2011-01-09 09:59 1064批量添加 在实 ... -
hibernate之数据存储
2011-01-07 16:33 7131,session.save(); 方法用于实体对象到数 ... -
hibernate之延迟加载(Lazy Loading)
2011-01-07 15:43 1193避免在某些情况下,关 ... -
Hibernate之查询缓存(The Query Cache)
2011-01-07 09:21 1033查询的结果集也可以被缓存。只有当经常使用同样的参数进行查询时, ... -
hibernate之数据加载---Session.get/load
2011-01-06 16:54 992Session.get/load() 都是根 ... -
hibernate之乐观锁(Optimistic Locking)
2011-01-06 16:34 1664相对于悲观锁,乐观锁采取了更加宽松的加锁机制,悲观锁大多数是依 ... -
Hibenate之悲观锁(Pessimistic Locking)
2011-01-06 15:34 1372什么是“锁”? 业务逻辑的实现过程中,往往需要保证数据的排他 ... -
Hibernate之事务管理
2011-01-06 15:00 813Hibernate是JDBC的轻量级封装,本身不具备事务管理能 ... -
初识---事务管理
2011-01-06 14:28 797何为“ 事务管理 ”? ... -
Hibernate之缓存同步策略
2011-01-06 13:43 1308缓存同步决定了数据对 ... -
Hibernate之数据缓存
2011-01-06 11:22 1096Hibernate数据缓存(cache ... -
认识数据缓存
2011-01-06 10:36 951数据缓存概述:在特定硬件基础上,缓存(Cache)往往是提升系 ... -
hibernate之脏数据检查
2011-01-06 09:54 2337HIbernate中有个名词---脏数据(dirty Data ... -
hibernate之实体对象生命周期
2011-01-06 09:16 991在Hibernate的应用中,实体对象的生命周期,是一个关键的 ... -
Hibernate之数据加载方式
2011-01-05 23:09 1121Hibernate 的数据加载方式: 在JDBC的操作中,利 ... -
Hibenrate之多对多关联
2010-12-31 16:39 1119Hibernate多对多关联可以分成单向和双向,多对多关系会借 ... -
Hibernate之一对多关联
2010-12-31 10:06 1377一对多关联分单向一对多关系 和双向一对多关系 ; 单向 ...
相关推荐
总之,理解和掌握`list()`和`iterator()`方法是使用Hibernate进行数据操作的关键技能之一。根据实际需求选择合适的方法,能有效地提升代码的性能和可维护性。在处理大数据量查询时,应特别关注内存管理和事务控制,...
3. **Query 和 list/iterator**:list 仅利用查询缓存,而 iterator 可以利用二级缓存。iterator 在处理大量数据时更为高效,因为它可以逐条加载数据并释放内存。 #### 八、总结 Hibernate 性能调优涉及多个层面,...
例如,如果在没有启用查询缓存时,使用`load()`方法获取的单个持久化对象会被缓存,但若想缓存`findAll()`, `list()`, `Iterator()`, `createQuery()`, `createCriteria()`等方法获取的结果集,必须设置`hibernate....
### Hibernate Criteria 分组、排序与关联查询详解 #### 标题与描述理解 - **标题**:“hibernate criteria 分组 排序 关联”这一标题明确了本文将围绕Hibernate Criteria API进行分组、排序以及关联查询的具体...
Hibernate查询提供了丰富的工具和策略,不仅限于基本的get()和load(),还包括高效的list()与iterator(),以及强大的HQL语言。理解并熟练掌握这些技术,对于Java开发者优化数据访问性能、提升应用程序效率至关重要。...
this.iterator = list.iterator(); } // 实现JRDataSource接口的方法 // ... } ``` 这个类允许我们在报表中通过字段名引用元组中的对象,使得报表能够正确显示数据。 5. **报表分页处理** 上述示例没有...
3. **Query 和 list/iterator**:list 方法仅利用查询缓存,而 iterator 方法可以利用二级缓存。在进行大量数据查询时,iterator 方法更加高效。 #### 七、总结 优化 Hibernate 的性能涉及到多个方面,包括数据库...
### HIBERNATE_QUERY知识点详解 #### 一、概述 Hibernate作为一款强大的对象关系映射...以上就是关于Hibernate查询机制的相关知识点介绍,通过这些方法和技术,开发者可以根据具体的应用需求选择最合适的查询方式。
在使用Hibernate进行数据查询时,Fetch Size的设置对性能有着显著的影响。Fetch Size是指每次从数据库中取出的数据行数,默认情况下,Oracle数据库的JDBC驱动程序中的Fetch Size被设置为15。然而,将Fetch Size增加...
在本文中,我们将深入探讨Hibernate框架中的数据查询,特别是使用Hibernate Query Language (HQL)。Hibernate是一个流行的Java持久化框架,它允许开发者通过面向对象的方式来操作数据库,极大地简化了数据库交互的...
《Hibernate难点解析与...理解并灵活运用uuid、get()与load()以及iterator()和list()的区别,是每个Hibernate开发者必备的技能。通过深入学习这些难点,开发者能够更好地驾驭Hibernate,从而提升项目的稳定性和性能。
### Hibernate 查询详解 #### 一、概述 在Java开发领域,Hibernate作为一种流行的持久层框架,提供了多种查询方式来实现对数据库的操作。本文将详细介绍Hibernate的几种主要查询方式,包括对象的状态变化、数据...
1. **SessionFactory**: 是Hibernate框架的核心接口之一,它是线程安全的,并且在整个应用中只需要创建一次。SessionFactory负责创建Session实例。 2. **Session**: 是一个轻量级的对象,用于处理数据库的所有操作,...
**hibernate_third项目源码**是一份专用于展示Hibernate框架不同查询技术的代码实例,涵盖了query、criteria以及SQL查询等多种方法。通过深入理解和实践这些源码,开发者可以更好地掌握Hibernate在实际开发中的应用...
Criteria Queries 是 Hibernate 的一种查询方式,可以使用面向对象的方式来查询对象。Criteria Queries 可以使用专门的 API 操作,例如 add、list 等。 Native SQL Hibernate 支持 native SQL 操作,可以使用原生 ...
以上介绍了Hibernate中几种常见的查询方式,包括HQL、QBC、原生SQL以及一些高级查询技巧如分组、排序等。掌握这些基本操作可以帮助开发者更高效地使用Hibernate框架进行数据访问操作。随着实践经验的积累,还可以...
- 可以使用s:iterator标签遍历集合,s:property获取对象属性,以渲染表格或其他UI元素。 7. **示例代码**: ```java // UserDAO.java public interface UserDAO { void addUser(User user); User getUserById...