Hibernate中延迟加载和缓存(3)

在Hibernate中内部缓存又称为一级缓存和事务级缓存由Hibernate自动维护不可卸载。其生命周期和Session对象的生命周期相同,当Session关闭时该缓存也会被自动回收。如下所示:

wpsCE99.tmp

其运行结果如下:

wpsCE9A.tmp

从结果中我们可以发现两次查询数据库时Hibernate值是生成了一条sql语句也就是说只有第一次查询时和数据库进行了交互,并将查询出的对象放入了内部缓存当第二次查询时Hibernate发现内部缓存中已经存在该对象则直接将该对象返回不在和数据库进行交互,并且这两次查询的对象的内存地址是完全相同的,由此可以得出内部缓存中缓存的是对象的内存地址的引用而不是对象的各个属性值!

二级缓存

二级缓存是可配置的插件,是进程或集群范围内的缓存,可以被所有的Session共享

二级缓存的配置

在Hibernate中配置二级缓存的插件有很多下面使用EHCache插件为例来配置二级缓存。

1.引入如下jar包。

      ehcache-1.2.3.jar  核心库

      backport-util-concurrent.jar

      commons-logging.jar

  2.配置Hibernate.cfg.xml开启二级缓存

<propertyname="hibernate.cache.use_second_level_cache">true</property>

3.配置二级缓存的供应商

<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

注:property元素必须在mapping元素之上

4.配置可进入二级缓存的类

<class-cache usage="read-write" class="cn.happy.entity.Emp"/>

5.在Classpath目录下引入ehcache.xml文件

wpsCE9B.tmp

经过以上5个步骤就可以将Dept对象放入二级缓存了,下面编写测试用例

wpsCE9C.tmp

测试结果:

wpsCE9D.tmp

wpsCE9E.tmp

从结果中我们可以开出第二次查询部门时并没有生成生成sql语句但是我们两次打印出的对象却不是同一个内存地址,这是因为二级缓存中存放的并不是对象象的内存地址的引用而是对象的散装属性(可以看成是对象的各个属性值)所以我们访问二级换存时需要将这些散装属性重新再内存中拼装成一个完整的对象。如果你仔细看的话你会发现当我们第二次去访问员工集合时Hibernate还是会生成sql语句。那是因为以上二级缓存的配置是针对类针对类级别的。如果想要将员工集合也进行缓存的话就需要在hibernate.cfg.xml配置文件中加入集合缓存的配置,内容如下:

wpsCE9F.tmp

注:该配置必须是mapping元素的下一个元素

这时我们再来运行测试用来结果如下:

wpsCEA0.tmp

wpsCEA1.tmp

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/6920e766361750004bdd71cc56ddc4ff.html