Hibernate优化(三) 之load/get、list/iterator

一、load和get方法的区别 

1、load在查询时,先从一级缓存中寻找与数据索引对应的实体对象,然后构建并返回一个代理对象,当我们真正使用这个代理对象的时候,这时候才会进入二级缓存查找或到数据库加载数据,如果数据库中没有找到则抛出一个ObjectNotFoundException;

2、get方法在查询时,同样是先从一级缓存中寻找与数据索引对应的实体对象,如果有则直接返回该实体对象,如果没有则马上进入二级缓存查找或到数据库加载数据,查找到则直接返回查询对象,没有则返回一个null;


二、list和iterator

1 、list方法会直接直接到数据库中加载数据,然后将查询结果放入缓存中,当然如果你配置了查询缓存,他会先进入查询缓存寻找,如果没有满足条件的再进入数据库加载数据;

2、iterator方法在查询时是先从数据库中查询出所有满足条件的数据索引,然后再根据这些数据索引进入一级和二级缓存进行匹配,如果对于数据索引有实体对象则直接返回该对象,如果没有则在具体使用对象的时候才会进入数据库加载数据,并且把数据索引和对于实体对象放进缓存;

3、什么时候使用最合适呢?个人建议第一次查询使用list直接从数据库中读取所有数据,然后放到了缓存中,后面使用Iterator,直接从缓存中读取,利于提高性能;

Query的两个方法,list() 和 iterate() , 两个方法都是把结果集列出来, 他们有3点不一样:

1:返回的类型不一样,list()返回List, iterate()返回Iterator

2: 获取数据的方式不一样,list()会直接查数据库, iterate()会先到数据库中把id都取出来,然后真正要遍历某个对象的时候先到缓存中找,如果找不到,以id为条件再发一条sql到数据库,这样如果缓存中没有数据,则查询数据库的次数为n+1。

3:iterate会查询2级缓存, list只会查询一级缓存。

4: list()中返回的List中每个对象都是原本的对象, iterate()中返回的对象是代理对象.(debug可以发现


三、延迟加载

1、对于load方法,它在查询对象的时候始终返回的一个代理对象,那么为什么hibernate要引入这么一个方式呢,为什么不像get方法一样直接返回查询对象呢?出于对hibernate的性能考虑,hibernate则提出了一个解决方案,那就是延迟加载,这里load方法的使用则正是实体对象延迟加载的表现。

2、hibernate中list和Iterator 区别,延迟加载

对于Query接口的list()和Iterator()方法来说,都可以实现获取查询的对象,但是list() 方法返回的是每一个对迪昂都是完整的(对象的每一个属性都被表中的字段填充上了),而Iterator()方法返回的对象中仅包含了主键值(标识符),只有当你对Iterator中的对象进行操作时,Hibernate才会向数据库发送SQL语句来获取属性值。
Iterator操作代码
Query q = session.createQuery("from UserModel");
 
Iterator<UserModel> iter = q.iterate();
 
while(iter.hasNext()){
System.out.println(iter.next());
}
list操作代码
Query q = session.createQuery("from UserModel");
 
List<UserModel> list = q.list();
 
for(Iterator<UserModel> iter = list.iterator();iter.hasNext();){
System.out.println(iter.next());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值