一. 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不一样。
谢谢!!!