同题。hibernate中一级缓存和二级缓存的具体区别是什么?在网上找不到满意的答案,发帖子讨论下。

解决方案 »

  1.   

    主要的不同是它们的作用范围不同。
    一级缓存是session级别的。
    也就是只有在同一个session里缓存才起作用。
    而二级缓存是sessionFactory级别的。
    其缓存对同一个sessionFactory生产出来的session都有效。
      

  2.   

    1.一级缓存是针对session级别的,当这个session关闭后这个缓存就不存在了。
    2.二级缓存是SessionFactory级别的,二级缓存我们通常使用其他的一些开源组件,比如hibernate经常使用的就是ECache,这个缓存在整个应用服务器中都会有效的。
     
    区别:两者的作用范围不同。
      
      

  3.   

    这些我知道,想问的是,为什么要设计成这样 ,设计成session级别的和sessionfactory全局级别的?
      

  4.   

    首先要明白缓存是干什么的,缓存就是要将一些经常使用的数据缓存到内存或者各种储存介质中,当再次使用时可以不用去数据库中查询,减少与数据库的交互,提高性能。
    再说明一级与二级缓存的作用:一级缓存是Session级别的,也就是说在一个事务中才会启作用。比如在一个事务中同时查询同一个对象,则不会两次去数据库中查询。
    而二级缓存是sessionFactory级别的,不同的事务之间是可以共享的,有些权限,当用户首次登陆后便将关联的权限放到二级缓存中,这样每次需要权限时就无需再查询数据库了。
    最后再说明为什么这样设计:一般情况下,我们查询的数据一般是实时的,使用二级缓存肯定不行,使用一级缓存既利用了缓存又不会影响实时。
    使用二级缓存是为了存储一些比较稳定的数据,如权限,只有在用户修改了权限且重新登录时才能生效。
      

  5.   

    一级缓存:Session级别的缓存
       当Session被open时,缓存即被open
       当Session被close时,缓存即被close
       在缓存open到close这段时间,多次加载同一个持久化对象,只有第一次向数据库发送SQL语句加载,之后的加载都是基于缓存的
       不过Session从打开到关闭的时间很短暂,一般在项目中都是在业务方法开始时打开Session,调用结束后即关闭Session,在如此短暂的瞬间时刻内,多次加载同一个对象的可能性不大,换言之,一级缓存的可用之处也并不大二级缓存:SessionFactory级别的缓存
       跟Session同理,level2 cache会随着sessionFactory的打开而打开,关闭而关闭。
       但是在一般的应用程序中,sessionfactory会以单例的形式存在,所以在整个应用程序的生命周期里,sessionfactory会一直存在。既二级缓存也一直存在直到关闭应用程序。
       
       二级缓存分为好几种,简单来讲就是类级别的缓存class-cache和查询缓存
    query-cache.
       前者是以id作为缓存的key。
       后者是以查询条件作为缓存的key。另外补充一点:在项目中,我们一般不太实用hibernate原生的缓存机制,原因是不好管理。更多时候,我们在业务层使用自己写的cache
      

  6.   

    1.一级缓存是针对session级别的,当这个session关闭后这个缓存就不存在了。
    2.二级缓存是SessionFactory级别的,二级缓存我们通常使用其他的一些开源组件,比如hibernate经常使用的就是ECache,这个缓存在整个应用服务器中都会有效的。
     
    区别:两者的作用范围不同。
      觉得还是去看书上说的。。
      

  7.   

    一级缓存:O-R映射的数据库实体对象
    二级缓存:echache,放你自己定义的公参或者其他业务数据
      

  8.   

    换个角度给你说,CPU有内部的缓存就相当于一级缓存,内存就相当于二级缓存。