Hibernate中Session方法介绍

开发 后端
本文向您介绍Hibernate中的Session方法,并比较Hibernate 2和Hibernate 3中Session方法的区别。

查询系统往往是一个系统性能表现的重要的方面,相对于删除和更新来说,查询的机制在很大程度上决定了一个系统的性能。

Hibernate2中,Session方法接口提供了如下的办法完成批量数据的查询(Session.locad单一数据的查询)

List Session.find(…..)
Iterator Session.iterator(……)

Hibernate3中上述接口已经从Session方法中废除,统一由Query接口提供,分别对应如下的办法:

List session.createQuery().list()
Iterator session.createQuery.iterator()

从实现机制上,两者没什么分别

Find/iterator方法可以根据查询条件返回符合条件的实体集。如下:

String sql=”from Tuser user where user.age>?”;
List ls = session.find(sql,new Integer(14),Hibernate.INTEGER);
int len = ls.size();
for(int i=0;i
Tuser user = (Tuser)ls.get(i);
System.out.println(“Username: ” + user.getName());
}

 

String sql=”from Tuser user where user.age>?”;
Iterator iterator = session.iterator(sql,new Integer(14),Hibernate.INTEGER);
While(iterator.next())
Tuser user = (Tuser)iterator.next(i);
System.out.println(“Username: ” + user.getName());
}

两者实现了统一的功能,但是大家在执行时看看他们输出的SQL语句,会发现有很多不同。两者的执行性能是不一样的,但是这又与Hibernate提供的缓存机制有很大的关系。

Find方法无法利用利用缓存来提供其执行性能,但iterator可以利用缓存机制来达到提高查询的性能。另外在内存使用方面,find方法是一次性查询处所有的结果,如果查询结果是海量的数据,那么就有可能出现内存溢出。但可以利用iterator和evict方法结合使用来将内存的消耗保持在一个可以接受的范围:

String sql=”from Tuser user where user.age>?”;
Iterator iterator = session.iterator(sql,new Integer(14),Hibernate.INTEGER);
While(iterator.next())
Tuser user = (Tuser)iterator.next(i);
session.evict(user); //从一级缓存中清除

二级缓存可以设置最大的缓存量,达到峰值时自动清除旧缓存数据,但我们这里可以通过编码指定将对象从二级缓存中清除,有助于保存缓存的有效性

sessionFactory.evict(Tuser.class,user.getID());
System.out.println(“Username: ” + user.getName());
}

上面的方法只是解决了部分的问题,由于JVM的异步的内存回收机制,无效的对象还会不断地在内存中积累等待回收。如果数据量较大,会频繁激发JVM回收,造成性能急剧下降,因此实际开发中,建议采用SQL语句或者存储过程实现。

【编辑推荐】

  1. 关于Hibernate你必须知道的六个方面
  2. Hibernate入门方法之手低眼高
  3. 浅谈Struts+Hibernate+Spring的整合方法
  4. Hibernate中Session.find/iterator方法
  5. 浅谈Struts分页中的Hibernate如何实现
责任编辑:张攀 来源: 新浪博客
相关推荐

2009-09-25 09:46:03

Hibernate s

2009-06-26 16:34:50

delete()方法Hibernate S

2009-06-26 16:33:09

saveOrUpdatHibernate

2009-09-27 14:41:05

Hibernate I

2009-09-24 17:24:20

Hibernate S

2009-09-29 16:04:29

Hibernate S

2009-09-23 17:03:08

Hibernate S

2009-09-25 10:53:40

Hibernate S

2009-09-22 10:09:21

Hibernate S

2009-09-25 13:51:13

Hibernate S

2009-09-23 17:18:16

Hibernate S

2009-06-18 13:42:48

Hibernate s

2009-09-24 13:25:58

Hibernate m

2011-06-16 10:48:33

session

2009-09-24 16:13:05

Hibernate S

2009-09-22 09:27:29

Hibernate P

2009-09-28 13:49:44

Hibernate Q

2009-09-25 13:55:05

Hibernate使用

2009-09-27 14:53:38

Hibernate S

2011-06-15 15:16:54

Session
点赞
收藏

51CTO技术栈公众号