11.Hibernate一级缓存

来源:互联网 发布:java long保留两位小数 编辑:程序博客网 时间:2024/04/30 05:21

  一级缓存生命周期很短于session生命周期一致,所以一级缓存也叫session级缓存或事务级缓存。位于缓存中的对象处于持久化状态,它和表中的相关记录对应,session能够在某些时间点,按照缓存中持久化对象的属性变化来同步数据库中表的记录(session关闭),这一过程称为缓存清理。当session关闭后一级缓存也就消失了。

注:当我们通过session获得一个对象以后,如果在本session没有关闭之前,再次获得之前获取过的数据,将直接从Session缓存中获取,而不是再次查询数据库。当然,你使用的方法必须支持一级缓存的读取,list()方法则不可以。

一级缓存原理,session缓存是由他的实现类sessionImpl中定义的一些结合属性构成的,运行时保证有一个引用在关联着某个持久化对象,保持它的生命周期不会结束。缓存是由HashMap<OID,Object>保存。OID是Session自己算出的主键,object是,持久化对象。

 

管理一级缓存:

   evict(Object) 移除对象
   clear() 清空缓存
   contains(Object) 判断缓存当中有没有指定对象
   flush() 刷新缓存,让缓存中的数据解析到同步列表

 

注:

  例如有两个用户,用户A和用户B,当用户A获取到一条记录,用户B在你获取完这条记录后,修改了这条记录,如果用户A在后续操作中修改了找条记录,在关闭Session的时候,会将这条记录提交到数据库,而这时数据库的记录则变成了,用户A修改的记录了。当然前提是你开启了事务,如果你没有开启事务则不会提交这条数据。


测试是否支持缓存:
  使用同一个Session,使用不同的方法进行查询,只要输出sql语句那么久说明不支持缓存的读,如果没有输出sql说明支持,缓存的读取。注意,必须查询的数据是同一个数据。





0 0