码迷,mamicode.com
首页 > Web开发 > 详细

Hibernate二级缓存

时间:2015-07-04 00:39:24      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:

第一级缓存:事务范围的缓存。Session缓存。存放元数据和预定义SQL。只读缓存。
 
第二级缓存:进程范围或者集群范围。由SessionFactory负责管理。SessionFactory的外置缓存。SessionFactory这个级别维护的缓存。二级缓存是针对整个应用而不是某个特定的session。

 

 

Session 如何判断持久化对象的状态的改变呢?

Session 加载对象后会为对象值类型的属性复制一份快照。当Session 清理缓存时,比较当前对象和它的快照就可以知道那些属性发生了变化。

 

Session 什么时候清理缓存?

1,commit() 方法被调用时

2,查询时会清理缓存,保证查询结果能反映对象的最新状态。

3,显示的调用session 的 flush方法。

 

session 清理缓存的特例:

当对象使用 native 生成器 时 会立刻清理缓存向数据库中插入记录。

 



【Hibernate Session缓存的三大作用】

1,减少数据库的访问频率,提高访问性能。

2,保证缓存中的对象与数据库同步,位于缓存中的对象称为持久化对象。

3,当持久化对象之间存在关联时,Session 保证不出现对象图的死锁。

 
 
【持久化层的缓存的并发访问策略
事务型:可重复读。
读写型:提交读。
非严格读写型:配置数据过期时间。
只读型:从来不会被修改的数据。
 
【二级缓存配置方法】
 



(1)什么是缓存

(2)有了hibernate的Session就是一级缓存,即有了一级缓存,为什么还要有二级缓存

(3)最后再说如何配置Hibernate的二级缓存。


(1)缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中,这个数据结构通常是或类似Hashmap,当以后要使用某个对象时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用。

 

下面是缓存的伪代码:
引出hibernate的第二级缓存,用下面的伪代码分析了Cache的实现原理

    1. Dao
    2. {
    3. hashmap map = new map();
    4. User getUser(integer id)
    5. {
    6. User user = map.get(id)
    7. if(user == null)
    8. {
    9. user = session.get(id);
    10. map.put(id,user);
    11. }
    12. return user;
    13. }
    14. }
    15. Dao
    16. {
    17. Cache cache = null
    18. setCache(Cache cache)
    19. {
    20. this.cache = cache
    21. }
    22. 
    23. User getUser(int id)
    24. {
    25. if(cache!=null)
    26. {
    27. User user = cache.get(id);
    28. if(user ==null)
    29. {
    30. user = session.get(id);
    31. cache.put(id,user);
    32. }
    33. return user;
    34. }
    35. return session.get(id);
    36. }
    37. }
 

(2)Hibernate的Session就是一种缓存,我们通常将之称为Hibernate的一级缓存。

        当想使用session从数据库中查询出一个对象时,Session也是先从自己内部查看是否存在这个对象,存在则直接返回,不存在才去访问数据库,并将查询的结果保存在自己内部。由于Session代表一次会话过程,一个Session与一个数据库连接相关连,所以Session最好不要长时间保持打开,通常仅用于一个事务当中,在事务结束时就应关闭

        并且Session是线程不安全的,被多个线程共享时容易出现问题。通常只有那种全局意义上的缓存才是真正的缓存应用,才有较大的缓存价值,因此,Hibernate的Session这一级缓存的缓存作用并不明显,应用价值不大。

        Hibernate的二级缓存就是要为Hibernate配置一种全局缓存,让多个线程和多个事务都可以共享这个缓存。我们希望的是一个人使用过,其他人也可以使用,session没有这种效果。


(3)二级缓存是独立于Hibernate的软件部件,属于第三方产品,多个厂商和组织都提供有缓存产品,例如,EHCache和OSCache等等。

        在Hibernate中使用二级缓存,首先就要在hibernate.cfg.xml配置文件中配置使用哪个厂家的缓存产品,接着需要配置该缓存产品自己的配置文件,最后要配置Hibernate中的哪些实体对象要纳入到二级缓存的管理中。

        明白了二级缓存原理和有了这个思路后,很容易配置起Hibernate的二级缓存。

 

扩展知识:

        一个SessionFactory可以关联一个二级缓存,也即一个二级缓存只能负责缓存一个数据库中的数据,当使用Hibernate 的二级缓存后,注意不要有其他的应用或SessionFactory来更改当前数据库中的数据,这样缓存的数据就会与数据库中的实际数据不一致。




Hibernate二级缓存

标签:

原文地址:http://www.cnblogs.com/lsx1993/p/4619982.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!