Hibernate缓存机制

Session缓存的作用

(1)减少访问数据库的频率。应用程序从内存中读取持久化对象的速度显然比到数据库中查询数据的速度快多了,因此Session的缓存可以提高数据访问的性能。

(2)保证缓存中的对象与数据库中的相关记录保持同步。当缓存中持久化对象的状态发生了变化,Session并不会立即执行相关的SQL语句,这使得Session能够把几条相关的SQL语句合并为一条SQL语句,以便减少访问数据库的次数,从而提高应用程序的性能。

clip_image002

从上图看出: 当我们去查询对象的时候,首先到一级缓存去取数据,如果有,则不到数据库中取,如果没有则到数据库中取,同时在一级缓存中放入对象.

一级缓存的细节

① 什么操作会向一级缓存放入数据

save,update,saveOrUpdate,load,get,list,iterate,lock

save 案例:

//添加一个学生

Student student=new Student();

student.setName(“小东”);

s.save(student);//放入一级缓存

//我马上查询

Student stu2=(Student) s.get(Student.class, student.getId()); //select

System.out.println(“你刚刚加入的学生名字是”+stu2.getName());

② 什么操作会从一级缓存取数据.

get / load / list

get / load 会首先从一级缓存中取,如没有.再有不同的操作[get 会立即向数据库发请求,而load 会返回一个代理对象,直到用户真的去使用数据,才会向数据库发请求]

?list 会不会从session缓存取数据?

案例:

//查询45号学生

Student stu=(Student) s.get(Student.class, 45);

System.out.println(“|||||||||||||||||||”);

String hql=”from Student where id=45″;

Student stu2=(Student) s.createQuery(hql).uniqueResult();

System.out.println(stu2.getName());

从上面的案例,我看出 query.list() query.uniueResut() 不会从一级缓取数据! 但是query.list 或者query.uniqueRestu() 会向一级缓存放数据的.

③ 一级缓存不需要配置,就可以使用,它本身没有保护机制,所以我们程序员要考虑这个问题,我们可以同 evict 或者 clear来清除session缓存中对象. evict 是清除一个对象,clear是清除所有的sesion缓存对象

④ session级缓存中对象的生命周期, 当session关闭后,就自动销毁.

Session的二级缓存

Hibernate提供了两级缓存,第一级缓存是Session的缓存。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。第一级缓存是必须的,不允许而且事实上也无法被卸除。在第一级缓存中,持久化类的每个实例都具有惟一的OID。 第二级缓存是一个可插拔的缓存插件,它由SessionFactory负责管理。由于SessionFactory对象的生命周期和应用程序的整个进程对应,因此第二级缓存是进程范围的缓存。这个缓存中存放的是对象的散装数据。第二级缓存是可选的,可以在每个类或每个集合的粒度上配置第二级缓存。

Hibernate二级缓存结构

u 为什么需要二级缓存?

因为一级缓存有限(生命周期短),所以我们需要二级缓存(SessionFactory缓存)来弥补这个问题

1. 需要配置

2. 二级缓存是交给第三方去处理,常见的Hashtable , OSCache , EHCache

3. 二级缓存的原理

clip_image002[5]

4. 二级缓存的对象可能放在内存,也可能放在磁盘.

u 快速入门案例

使用OsCache来演示二级缓存的使用.

1. 配置二级缓存

对配置说明:

<property name=”hbm2ddl.auto”>update</property>

<!– 启动二级缓存 –>

<property name=”cache.use_second_level_cache”>true</property>

<!– 指定使用哪种二级缓存 –>

<property name=”cache.provider_class”>org.hibernate.cache.OSCacheProvider</property>

<mapping resource=”com/hsp/domain/Department.hbm.xml” />

<mapping resource=”com/hsp/domain/Student.hbm.xml” />

<!– 指定哪个domain启用二级缓存

特别说明二级缓存策略:

1. read-only

2. read-write

3. nonstrict-read-write

4. transcational

–>

<class-cache class=”com.hsp.domain.Student” usage=”read-write”/>

2. 可以oscache.properties文件放在 src目录下,这样你可以指定放入二级缓存的对象capacity 大小. 默认1000

 

除非注明,Coder文章均为原创,转载请以链接形式标明本文地址

本文地址:http://www.alonemonkey.com/hibernate-cache.html

本文链接:http://www.alonemonkey.com/hibernate-cache.html