标签:
Hibernate的缓存一般分为3类:
1).一级缓存.Session缓存称为一级缓存,由于Session对象的得生命周期通常对应一个数据库事务,因此它的缓存是事务范围的缓存,.注意: 一级缓存是必需的.在一级缓存中,持久化类的每个实例都具有唯一性的OID.
2).二级缓存.SessionFactory缓存分为内置缓存和外置缓存.内置缓存是Hibernate自带的,不可拆卸,是只读缓存,用来存放映射元数据和预定义SQL语句.外置缓存是一个可配置的缓存插件,默认SessionFactory不会启用这个缓存插件.外置缓存中的数据库数据的复制. SessionFactory对象的生命周期和应用程序的整个进程对应.二级缓存是可选的,可以在每个类型或每个集合的粒度上配置二级缓存.
3). 查询缓存,它是Hibernate为查询结果提供的,依赖二级缓存.
(1) 事务范围.每个事务都有自己的缓存,缓存内数据不会被多个事务并发访问.例如,Hibernate的以及缓存,事务是不能跨多个Session的,Session内数据只能被当前事务访问,因此它属于事务范围的缓存.
(2) 进程范围.进程内的所有事务共享缓存,进程结束,缓存结束生命周期,例如,Hibernate的二级缓存,SessionFactory对象的生命周期对应应用程序的整个进程,因此它属于进程范围的缓存.
(3) 集群缓存范围.缓存被一个或多个机器上的多个进程共享.Hibernate的二级缓存也可以作为集群范围的缓存.
Hibernate 一级缓存:
刚才说了,Session内的缓存就是一级缓存,位于缓存中的对象成为持久化对象,它和数据库中的相关记录对应.Session能够在某些时间点,按照缓存中对象的变化执行相关SQL语句,从而同步更新数据库,这一过程称为刷新缓存.
当应用程序调用Session的save() , update() , saveOrUpdate() , load() 或get() 方法,以及调用Query查询接口的list() iterate方法时 ,如果在Session的缓存中还不存在相应的对象,Hibernate就会把该对象加入到一级缓存中.在刷新缓存时Hibernate会根据缓存中对象的状态变化来同步更新数据库.由此可见,Session缓存有两大作用:
(1)减少访问数据库中的相关记录与缓存中的相应对象同步.
(2)保证数据库中的相关记录与缓存中的相应对象同步.
举个栗子:
User user1=(User) session.get(User.class, new Byte("1")); User user2=(User) session.get(User.class, new Byte("1")); System.out.printIn(user1==user2);
在控制台可以看到,只输入了一次select语句,user1和user2引用的是同一个对象,第三行输出了 true !
因为第一次user1在数据库中查询了一次,缓存在session中,所以user2查询的是session中的user1的缓存
Session为引用程序提供了两个管理缓存的方法:
(1) evict(Object o) :从缓存中清除指定的持久化对象.
(2)clear() 清空缓存中的所有持久化对象.
额 还有一个好用的东西: 就是 flush() 方法,flush() 方法用于强制进行从缓存到数据库的同步.
例如:
User user=null; for(int i=0;i<1000;<i++) { user=new User(i,"user"+i); session.save(user); if(i%30==0) { session,flush(); session.clear(); } } tx.commit();
标签:
原文地址:http://www.cnblogs.com/yccmelody/p/5490163.html