一级缓存的使用经验

1.Session 级别的缓存,它同session邦定。它的生命周期和session相同。Session消毁,它也同时消毁;管理一级缓存,一级缓存无法取消;

 2.两个session 不能共享一级缓存,因它会伴随session的生命周期的创建和消毁

 3.Session缓存是实体级别的缓存,就是只有在查询对象级别的时候才使用,如果 使用HQL和SQL是查询属性级别的,是不使用一级缓存的!切记!!!!

4。String hql = "from Student";
  Query query = session.createQuery(hql);

如果返回Iterator    Iterator<Student> stus = query.iterate();

它查询完会把相应的实体放到缓存里边,缓存是一个Map key 是id , values 是实体对象。当查询时先根据

语句1:select student0_.id as col_0_0_ from Student student0_  //当执行iterate方法的时候

到数据库找出所有的 id ,接着按照id 到缓存里面查找,如果没有命中,再到数据库中查找该id对应的其他属性,所以可能会发生n+1查询。

如果是使用list

List<Student> stus = query.list();

会把所有的查询结果放到list中。一次加载到内存。

语句:select student0_.id as id3_, student0_.studentage as studentage3_, student0_.studentname as studentn3_3_ from Student student0_//当执行list方法的时候

 使用List的时候,即使缓存中存在数据 也都会到数据库查询。

5.    Session.save(object);

    这时候不会把数据放到数据库,会先放到session缓存中去,数据库中没有相应记录,session.flush();才发SQL和HQL语句,数据库中有了相应记录,

    但是数据库用select查不到,这是跟数据库事物级别有关系。

    Session.beginTrransaction()。commit();

    事物提交后可以查询到了。

    Session.flush()语句但是为什么不写呢,因为commit()会默认调用flush();

6.无论何时,我们在管理Hibernate缓存(Managing the caches)时,当你给save()、update()或saveOrUpdate()方法传递一个对象时,或使用load()、 get()、list()、iterate() 或scroll()方法获得一个对象时, 该对象都将被加入到Session的内部缓存中。
当随后flush()方法被调用时,对象的状态会和数据库取得同步。 如果你不希望此同步操作发生,或者你正处理大量对象、需要对有效管理内存时,你可以调用evict() 方法,从一级缓存中去掉这些对象及其集合。

猜你喜欢

转载自joezheng123.iteye.com/blog/1861057
今日推荐