jackyrong

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1 hibernate 中的缓存问题

   A 一级缓存和session的生命周期一样的,在比如
      Student student=(Student)session.load(Student.class,1);
     这样的语句中,如果两次发出这样的语句,是可以用到缓存的。
     同样,用get也是可以用缓存的。

   B 如果是用迭代查询,比如这样:
       Student student=(Student)session.createquery("from student s where s.id=1").iterate().next();
       之类的话。是能用缓存的。

       但如果查询普通属性的话,比如
 
 Student student=(Student)session.createquery("select s.name from  student s where s.id=1").iterate().next();
    如果两次查询的话,则不能用缓存,是要再发多条sql语句的。

    所以一级缓存是缓存实体对象的。
  
  B  以上说的是在一个session中发出的。如果在两个session中的话。它们之间不能用缓存。

  C   在同一个session中,先用session.load查询,然后session.clear(),
再用session.load(),则很明显不能用缓存了,肯定要发出sql.可见
session.clear()是可以清除一级缓存的。可以看到,hibernate的一级缓存
是咱们控制不了的。
   D  避免一次性大量实体数据入库,先flush,后clear.

2 hibernate 的ecache的设置,见http://www.cnblogs.com/jackyrong/archive/2008/08/29/1279083.html

3 查询缓存:
   Query query=session.createQuery(".......");
    query.setCacheable(true);
  
  要注意的是,查询级缓存,只对如query,list()起作用,对query.iterate()不起作用

   注意查询缓存的时候,在hibernate.cfg.xml中
   <property name="hibernate.cache.use_query_cache">true</property>

posted on 2008-09-10 23:19  jackyrong的世界  阅读(555)  评论(0编辑  收藏  举报