Hibernate的一级缓存和二级缓存(七)

感谢Jie’ blog http://ilog.vip/ ,谢谢他让我有了继续写下去的信念。愿一起坚持,在路上…
上一章简单介绍了Hibernate的常用方法区别(六),如果没有看过,请观看上一章

一. Hibernate的一级缓存

Hibernate的一级缓存和二级缓存(七)
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();
	}

查看控制台:
Hibernate的一级缓存和二级缓存(七)
只执行了一条语句,返回值为true。 即说明,只从数据库中中查询了一次。
只查询一次,是因为快照区的作用.
Hibernate的一级缓存和二级缓存(七)
 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的一级缓存和二级缓存(七)
Hibernate的一级缓存和二级缓存(七)

四.二 在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();
	}

控制台输出为:
Hibernate的一级缓存和二级缓存(七)
只有一条查询语句,其中user1与user2相同,但是user1与user3不一样。

谢谢!!!