Hibernate进阶之缓存

首先,我们这里需要讲一下什么时缓存以及我们为什么要使用缓存

一、什么是缓存:
1.缓存是指为了降低应用程序对物理数据源访问的频次从而提高应用程序的运行性能的一种策略。

二、为什么使用缓存:
1.ORM框架访问数据库的效率直接影响应用程序的运行速度,提升和优化ORM框架的执行效率至关重要。
2.Hibernate的缓存是提升和优化Hibernate执行效率的重要手段,所以学会Hibernate缓存的使用和配置是优化的关键。
3.评判一个ORM框架是否优秀,访问数据库的频次就一个重要的标准。

其次,在Hibernate中存在着一级缓存以及二级缓存。对于一级缓存也叫session级别的缓存,一级缓存是将我们重复的数据缓存在同一个session中减少对数据库的访问,Hibernate框架是默认开启一级缓存的,我们在使用的时候就能体现出一级缓存的作用。在本篇博客我们重点来说下二级缓存(应用级别的缓存)。


二级缓存的作用是什么?它是将我们重复查询的数据的缓存区域扩大到不同的session中,以达到应用级别的缓存,二级缓存Hibernate框架是默认不开启的并且需要第三方的缓存框架去实现二级缓存的实现,在此我们用的是ehcache来实现二级缓存。好,接下来我们就来实现一下。


1.在pom.xml中写入相关的依赖(没有使用maven的小伙伴可以直接将需要的jar包导入工程,是一样的操作)

<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.12</version>
</dependency>

<!-- hibernate所需的依赖 -->
<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-core</artifactId>
	<version>4.2.4.Final</version>
</dependency>

<!-- 数据库驱动包 -->
<dependency>
	<groupId>com.oracle</groupId>
	<artifactId>oracle_driver</artifactId>
	<version>oracle11g</version>
</dependency>

<!-- 二级缓存 -->
<dependency>
	<groupId>net.sf.ehcache</groupId>
	<artifactId>ehcache-core</artifactId>
	<version>2.4.3</version>
</dependency>

<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-ehcache</artifactId>
	<version>4.2.5.Final</version>
</dependency>

2.我们依旧沿用之前的实体类以及配置文件,需要对cfg以及需要缓存的实体类的hbm增加以下配置

cfg文件

<!-- 配置二级缓存 -->  
<property name="hibernate.cache.use_second_level_cache">true</property>  
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>  
<!-- 开启查询缓存 -->  
<property name="hibernate.cache.use_query_cache">true</property> 


hbm文件,在class标签里配置

<!-- 开启二级缓存 
    	usage事务模式
    	include non-lazy 不缓存延迟加载的属性,跟其他实体相关联的属性
    	region 可以在encache.xml中去特意的配置该缓存策略
-->
<cache usage="read-only" include="all" />


3.编写测试类

package com.yc.test;

import org.hibernate.Session;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.yc.entity.Employee;
import com.yc.utils.HibernateUtil;

public class MyTestTwoCache {
	private Session session;

	@Before
	public void init(){
		session=HibernateUtil.getSession();
	}

	@After
	public void destory(){
		HibernateUtil.closeSession(session);
	}
	
	@Test
	public void testCache(){
		Employee e1=(Employee) session.get(Employee.class, 1000);
		System.out.println(e1);
		System.out.println("==我==是==分==割==线==");
		session=HibernateUtil.getSession();
		e1=(Employee) session.get(Employee.class, 1000);
		System.out.println(e1);
	}
}


为了证实二级缓存的作用,我们先将hbm配置文件中的cache标签注释来运行一下,即没有使用二级缓存的情况


我们会发现对于相同的数据,在不同的session中发送了两次sql语句,这不是我们想要的结果。将hbm文件中的cache标签注释去掉,即开启我们的二级缓存再来运行测试一下



OK,我们发现这次并没有第二条sql语句出现,二级缓存配置成功!!!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章