[原创]Hibernate 的二级缓存_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
2
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 4419 | 回复: 1   主题: [原创]Hibernate 的二级缓存        下一篇 
zhian.zuo
注册用户
等级:上士
经验:314
发帖:10
精华:0
注册:1970-1-1
状态:离线
发送短消息息给zhian.zuo 加好友    发送短消息息给zhian.zuo 发消息
发表于: IP:您无权察看 2014-7-1 15:44:42 | [全部帖] [楼主帖] 楼主

     最近想熟悉下ssh三大框架的深入知识,下面主要介绍下hibernate二级缓存的一些基本知识:
按照以下思路来:
    1.首先说清楚什么是缓存;2.再说有了hibernate的Session就是一级缓存,即有了一级缓存,为什么还要有二级缓存;3.最后再说如何配置Hibernate的二级缓存。
  (1)缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中(一个数据结构中),这个数据结构通常是或类似 Hashmap,当以后要使用某个对象时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用。下面是缓存的伪代码:
引出hibernate的第二级缓存,用下面的伪代码分析了 Cache 的实现原理

Dao
{
      hashmap map = newmap();
      User getUser(integerid)
      {
            User user =map.get(id);
            if(user ==null)
            {
                  user =session.get(id);
                  map.put(id,user);
            }
            return user;
      }
}
Dao
{
Cache cache = null
setCache(Cachecache)
{
      this.cache =cache;
}
User getUser(int id)
{
      if(cache!=null)
      {
            Useruser = cache.get(id);
            if(user==null)
            {
                  user= session.get(id);
                  cache.put(id,user);
            }
            return user;
      }
      returnsession.get(id);
}
}


(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来更改当前数据库中的数据,这样缓存的数据就会与数据库中的实际数据不一致。




赞(0)    操作        顶端 
java_along
注册用户
等级:上尉
经验:771
发帖:36
精华:0
注册:2014-2-17
状态:离线
发送短消息息给java_along 加好友    发送短消息息给java_along 发消息
发表于: IP:您无权察看 2014-7-1 23:28:52 | [全部帖] [楼主帖] 2  楼

学习~~



赞(0)    操作        顶端 
总帖数
2
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论