Hibernate的一级缓存和二级缓存(七)
感谢Jie’ blog http://ilog.vip/ ,谢谢他让我有了继续写下去的信念。愿一起坚持,在路上…
上一章简单介绍了Hibernate的常用方法区别(六),如果没有看过,请观看上一章
一. Hibernate的一级缓存
一级缓存的范围是Session。
一级缓存的特点,只在session范围有效,作用时间短,效果不是特别明显,在短时间内多次操作数据库,效果比较明显。
二. 一级缓存的测试
@Test
public void cacheTest(){
Session session=HibernateUtil.getSession();
User user1=session.get(User.class,8);
User user2=session.get(User.class,8);
System.out.println(user1==user2);
session.flush();
}
查看控制台:
只执行了一条语句,返回值为true。 即说明,只从数据库中中查询了一次。
只查询一次,是因为快照区的作用.
Session关闭后,不能使用懒加载数据,如果session关闭后,使用懒加载数据报错
三.Hibernate的二级缓存
Hibernate提供了基于应用程序级别的缓存即为二级缓存,可以跨多个session,即不同的session都可以访问缓存数据。 这个缓存也叫二级缓存。
Hibernate提供的二级缓存有默认的实现,且是一种可插配的缓存框架!如果用户想用二级缓存,只需要在hibernate.cfg.xml中配置即可; 不想用,直接移除,不影响代码。
如果用户觉得hibernate提供的框架框架不好用,自己可以换其他的缓存框架或自己实现缓存框架都可以。
什么样的数据,适合放在二级缓存中呢?
1. 很少被修改的数据
2. 不是很重要的数据,允许出现偶尔并发的数据
3. 不会被并发访问的数据
4. 参考数据
什么样的数据,不适合放在二级缓存中呢?
1. 经常被修改的数据
2. 财务数据,绝对不允许出现并发
3. 与其他应用共享的数据。
四. 如何开启二级缓存
Hibernate的一级缓存是默认开启的,二级缓存则需要自己手动进行开启。
四.一 添加EhcacheJar包
将Hibernate安装包下的Jar包,在hibernate-release-5.2.17.Final\lib\optional\ehcache
四.二 在hibernate.cfg.xml中添加配置
<!-- 开启二级缓存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class ">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
<!-- 配置RegionFactory为Ehcache的RegionFactory -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
Ctrl+鼠标,可以点击进去。
四.三 添加ehcache.xml文件
在src下添加ehcache.xml文件,内容是:
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
</ehcache>
四.四 在要缓存的User.hbm.xml文件中添加
<class name="User" table="user" lazy="true">
<!-- 添加二级缓存 -->
<cache usage="read-write" /><!-- 二级缓存配置 只读时为read-only -->
<!-- 主键 -->
<id name="id" column="id">
<generator class="native"></generator>
</id>
.....
</class>
四.五 进行测试
@Test
public void cache2Test(){
Session session=HibernateUtil.getSession();
User user1=session.get(User.class,8);//第一次查询语句
User user2=session.get(User.class,8);//不会查询语句
System.out.println(user1==user2);
System.out.println("user1:"+user1);
session.close();
Session session2=HibernateUtil.getSession();
User user3=session2.get(User.class,8);//不查询语句
System.out.println("user3:"+user3);
session.close();
}
控制台输出为:
只有一条查询语句,其中user1与user2相同,但是user1与user3不一样。
谢谢!!!