您的位置:首页 > 其它

list和iterator方法的区别

2013-11-04 11:55 309 查看
1.先介绍一下java中的缓存系统JCS(java cache system)

            1.1、JCS(Java Caching System)是一个对象Cache,它可以把Java对象缓存起来,提高那些访问频率很高的Java对象的存取效率。JCS是按照对象的唯一标示来存取对象的,比如说可以按照对象的    hashCode来存取。

             1.2、对于Hibernate来说,可以利用JCS来缓存查询结果,这样当下次访问同样的数据,就无须去数据库取,直接从JCS中取出来,加快了查询速度。 

             1.3、当Hibernate使用List或者Iterator方式来第一次读取数据的时候,JCS是空的,此时不管是List方式还是Iterator方式都会往JCS里面填充查询出来的持久对象,

            例如:  select c from Cat as c

            而 select c.id, c.name from Cat as c 这种HQL语句不构造PO,因此不会去填充JCS。 

             1.4、从JCS中区数据:

             从JCS中取数据是按照对象的唯一标示来存取的,而对于PO持久对象来说,唯一标示就是主键,因此Hibernate首先必须获得主键列表,然后根据主键列表挨个判定,看这个持久对象究竟是在JCS里面还是在数据库里面,假如在JCS里面,那么按照主键取,假如在数据库,那么发送sql取。

              1.5、这里先介绍一下Iterator可以使用JCS,而List不能。上面说了,用JCS之前,要先获得持久对象的主键,才能去JCS里面取持久对象,而获得主键列表必须去数据库中取得,这一步是没有办法缓冲的。

2.看两个例子来比较一下
(1)在用Query方法查询的时候,通过HQL语句来得到Query对象,并对Query对象进行操作,首先是用list方法获取到Query的List集合并输出
public void listQuery() {
       Configuration configuration = new Configuration().configure();
       SessionFactory factory = configuration.buildSessionFactory();
       Session session = factory.openSession(); 
        Query query = session.createQuery("from Customers");
       List<Customers> list = query.list();
       for(Customers entity:list){
           System.out.println(entity.toString());
       }
}
或者如下代码:
 
输出的结果为:
List的执行sql语句为:
Hibernate: select customers0_.id as id0_, customers0_.realName as realName0_, customers0_.pass as pass0_, customers0_.sex as sex0_, customers0_.petName as petName0_, customers0_.email as email0_, customers0_.rdate as rdate0_ from
customers customers0_
cn.csdn.products.domain.Customers@5bf624
(2)通过Query得到Query的对象,并用iterator迭代器输出
    public void iterateQuery(){
       Configuration configuration = new Configuration().configure();
       SessionFactory factory = configuration.buildSessionFactory();
       Session session = factory.openSession();
       Query query = session.createQuery("from Customers");
       Iterator<Customers> it = query.iterate();
       // 遍历出来所有的查询结果
       while (it.hasNext()) {
           Customers customer = it.next();
           System.out.println(customer.toString());
       }
    }
Iterator的执行结果:
Hibernate: select customers0_.id as col_0_0_ from customers customers0_
 
Hibernate: select customers0_.id as id0_0_, customers0_.realName as realName0_0_, customers0_.pass as pass0_0_, customers0_.sex as sex0_0_, customers0_.petName as petName0_0_, customers0_.email as email0_0_, customers0_.rdate as rdate0_0_
from customers customers0_ where customers0_.id=?
cn.csdn.products.domain.Customers@1d13272
 
结论:
(1)       从上面的执行结果可以看出获取的方式不一样
List的获取方式为:
                           List<Customers> list = query.list();
      Iterator的获取方式:
           Iterator<Customers> it = query.iterate();
(2)从执行结果可以看出list输出一条语句,而iterator输出的是两条sql语句,我们可想一下,为什么会输出这样的效果?
因为他们获取数据的方式不一样,list()会直接查询数据库,iterator()会先到数据库中把id都取出来,然后。
list是JDBC的简单封装,一次sql就把所有的数据都取出来了,它不会像Iterator那样先取主键,然后真正要遍历某个对象的时候先到缓存中找,如果找不到,以id为条件发一条sql到数据库,这样如果缓存中没有数据,则查询数据库的次数为n+1次,因此List无法利用JCS。不过List也可以把从数据库中取出的数据填充到JCS里面去。当再次使用list查询数据的时候,仍然要发送sql去数据库中读取数据,证明list()方法不使用缓存

(3)list只查询一级缓存,而iterator会从二级缓存中查
(4)list方法返回的对象都是实体对象,而iterator返回的是代理对象
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息