二级缓存是进程或集群范围内的缓存,可以被所有的Session共享
二级缓存是可配置的插件
01.二级缓存的配置使用(ehcache缓存)
*1.引入如下jar包。
ehcache-1.2.3.jar 核心库
backport-util-concurrent.jar
commons-logging.jar
*2.配置Hibernate.cfg.xml开启二级缓存
<property name="hibernate.cache.use_second_level_cache">true</property>
*3.配置二级缓存的供应商
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
在大配置文件(hibernate.cfg.xml)中配置
<class-cache usage="read-write" class="cn.happy.entity.Student"/> <collection-cache usage="read-write" collection=""/>
二级缓存保存数据原理:
二级缓存测试:
/** * 测试二级缓存 */ @Test public void testBulk(){ //获取的数据一样 Session session = HibernateUtil.getSession(); Transaction tx=session.beginTransaction(); Dept dept = (Dept)session.get(Dept.class,1); System.out.println(dept.getDeptName()); tx.commit(); HibernateUtil.closeSession(); System.out.println("==========================="); //因为有二级缓存 所以 不显示SQL语句 Session session2 = HibernateUtil.getSession(); Transaction tx2=session2.beginTransaction(); Dept dept2 = (Dept)session2.get(Dept.class,1); System.out.println(dept2.getDeptName()); tx2.commit(); HibernateUtil.closeSession(); }
运行结果:
因为有二级缓存,都是查询部门名称,所以第二次查询不显示SQL语句
测试查询缓存:
list()方法
/** * 测试查询缓存 * */ @Test public void testCache(){ session=HibernateUtil.getSession(); Transaction tx=session.beginTransaction(); Query query = session.createQuery("from Emp"); //list()只能放数据 不能取出 List<Emp> list = query.list(); for (Emp emp : list) { System.out.println(emp.getEmpName()); } System.out.println("================================"); //不显示SQL:上一步已经放入 二级缓存 List<Emp> list1 = query.list(); for (Emp emp : list1) { System.out.println(emp.getEmpName()); } System.out.println("================================"); }
运行结果
首先放入数据,list()方法只能放入数据,不能取出数据,所以当运行查询语句,显示了两条SQL语句,这说明了ist()方法只能放入数据,不能取出数据,内存地址不同,所以显示两条SQL语句
iterate()方法
运行结果:
iterate()方法可以取出数据,运行查询语句,显示两条SQL,但是这两条SQL是不一样的,印证了iterate()方法可以取出数据