架包
ehcache-core-2.4.3.jar
slf4j-api-1.6.1.jar
pom.xml
<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.20.Final</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
hibernate.cfg.xml
<!-- 开启二级缓存 --> <property name="cache.use_second_level_cache">true</property> <!-- 开启查询缓存 --> <property name="hibernate.cache.use_query_cache">true</property> <property name="hibernate.cache.region.factory_class"> org.hibernate.cache.EhCacheRegionFactory </property>
Emp.hbm.xml<hibernate-mapping> <class name="cn.et.hibernate.lesson02.relation.Emp" table="EMP" schema="SCOTT"> <!-- 设置该映射文件使用二级缓存 --> <cache usage="read-only"/> <id name="empno" type="java.lang.Short"> <column name="EMPNO" precision="4" scale="0" /> <generator class="assigned" /> </id>
测试类package cn.et.hibernate.lesson02.cache; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Restrictions; import org.junit.Test; import cn.et.hibernate.lesson02.relation.Emp; /** * 一级缓存 同一个Session * 二级缓存 同一个SessionFactory */ public class TestHibernate { /** * 一级缓存 同一个Session */ @Test public void test(){ SessionFactory sf = new Configuration().configure("/cn/et/hibernate/lesson02/relation/hibernate.cfg.xml").buildSessionFactory(); Session session = sf.openSession(); Emp emp = (Emp)session.get(Emp.class, Short.parseShort("8000")); Emp emp1 = (Emp)session.get(Emp.class, Short.parseShort("8000")); System.out.println(emp==emp1); } /** * 二级缓存 同一个SessionFactory * 二级缓存默认是关闭的 */ @Test public void test1(){ SessionFactory sf = new Configuration().configure("/cn/et/hibernate/lesson02/relation/hibernate.cfg.xml").buildSessionFactory(); Session session = sf.openSession(); Emp emp = (Emp)session.get(Emp.class, Short.parseShort("8000")); Session session1 = sf.openSession(); Emp emp1 = (Emp)session1.get(Emp.class, Short.parseShort("8000")); System.out.println(emp==emp1); } /** * 查询缓存是基于二级缓存的 * 查询缓存是无法预知查询数据量的大小 经常会出现性能问题 */ @Test public void test2(){ SessionFactory sf = new Configuration().configure("/cn/et/hibernate/lesson02/relation/hibernate.cfg.xml").buildSessionFactory(); Session session = sf.openSession(); Query query = session.createQuery("from Emp where sal>200"); List list = query.list(); Session session1 = sf.openSession(); Emp emp1 = (Emp)session1.get(Emp.class, Short.parseShort("8000")); System.out.println(emp1.getEname()); } }