通过iterator,配合缓存管理API,在海量数据查询中可以很好的解决内存问题,如:
while(it.hasNext()){YouObject object = (YouObject)it.next();session.evict(youObject);sessionFactory.evice(YouObject.class, youObject.getId());}如果用list方法,很可能就出OutofMemory错误了。不知道一下两行是什么意思?
 
session.evict(youObject);//应该是清除缓存中具体某个对象,难道此时要是具体某个对象清除吗sessionFactory.evice(YouObject.class, youObject.getId()); //这一不知道是什么意思?谢谢大家回复?
     

解决方案 »

  1.   


    当你给save()、update()或 saveOrUpdate()方法传递一个对象时,或使用load()、 get()、list()、iterate() 或scroll()方法获得一个对象时, 该对象都将被加入到Session的内部缓存中。 当随后flush()方法被调用时,对象的状态会和数据库取得同步。 如果你不希望此同步操作发生,或者你正处理大量对象、需要对有效管理内存时,你可以调用evict() 方法,从一级缓存中去掉这些对象及其集合。 对于二级缓存来说,在SessionFactory中定义了许多方法, 清除缓存中实例、整个类、集合实例或者整个集合。 
    sessionFactory.evict(Cat.class, catId); //evict a particular Cat
      

  2.   

    session.evict(obj),会把指定的缓冲对象进行清除
    sessionFactory.evice(YouObject.class, youObject.getId());
     //清除youObject.getId()指定的YouObject.class对象
      

  3.   

    session.evict(youObject); 是用来清空缓存的,当你海量处理数据的时候,Hibernate 一起读,肯定内存爆掉。只能分批分页读。但是 缓存也有大小限制的呀,所有要定时flush数据到DB,然后将 已经处理的数据从缓存里面清除掉。
      

  4.   

    Hibernate 中的二级缓存。
    session.evict(youObject); 是操作的一级缓存。
    sessionFactory.evice(YouObject.class, youObject.getId()); 是操作的二级缓存。
    以上两种方法都是清除缓存中的对象来释放资源。另外顶下4楼,说的很详细。