使用Hibernate缓存数据.ppt

上传人:小** 文档编号:86720438 上传时间:2019-03-23 格式:PPT 页数:16 大小:497KB
返回 下载 相关 举报
使用Hibernate缓存数据.ppt_第1页
第1页 / 共16页
使用Hibernate缓存数据.ppt_第2页
第2页 / 共16页
使用Hibernate缓存数据.ppt_第3页
第3页 / 共16页
使用Hibernate缓存数据.ppt_第4页
第4页 / 共16页
使用Hibernate缓存数据.ppt_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《使用Hibernate缓存数据.ppt》由会员分享,可在线阅读,更多相关《使用Hibernate缓存数据.ppt(16页珍藏版)》请在金锄头文库上搜索。

1、第15章 使用Hibernate 缓存数据,目 录,1,2,缓存的概念和范围,一级缓存,2,3,4,二级缓存,查询缓存,15.1,缓存的概念和范围,3,15.1 缓存的概念和范围,4,缓存的介质一般是内存,所以读写速度很快。但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质。缓存的实现不仅仅要考虑存储的介质,还要考虑到管理缓存的并发访问和缓存数据的生命周期。 Hibernate的缓存包括Session的缓存和SessionFactory的缓存,其中SessionFactory的缓存又可以分为两类:内置缓存和外置缓存。 Session的缓存是内置的,不能被卸载,也被称为Hibernate的

2、第一级缓存。SessionFactory的缓存又被称为Hibernate二级缓存。 Hibernate缓存的范围包括事务范围、进程范围和集群范围,具体如下: (1) 事务范围: (2) 进程范围: (3) 集群范围:,Hibernate提供的一级缓存是一个线程对应一个session,一个线程可以看成一个用户。也就是说session级缓存(一级缓存)只能给一个线程用,别的线程用不了,一级缓存就是和线程绑定了。Hibernate一级缓存生命周期很短,和session生命周期一样,一级缓存也称session级的缓存或事务级缓存。如果事务提交或回滚了,我们称session就关闭了,生命周期结束了。 H

3、ibernate二级缓存需要sessionFactory来管理,它是进初级的缓存,所有人都可以使用,它是共享的。使用缓存,肯定是长时间不改变的数据,如果经常变化的数据放到缓存里就没有太大意义了。因为经常变化,还是需要经常到数据库里查询,那就没有必要用缓存了。,(1) 事务范围:缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期,当事务结束时,缓存也就结束生命周期。在此范围下,缓存的介质是内存。 (2) 进程范围:缓存被进程内的所有事务共享。这些事务有可能是并发访问缓存,因此必须对缓存采取必要的事务隔离机制。 (3) 集群范围:在集群环境中,缓存被一个机器或者多个机器的进程共享。缓存中的

4、数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中的数据一致性,缓存中的数据通常采用对象的松散数据形式。,15.2,一级缓存,5,15.2 一级缓存,6,Hibernate的一级缓存由Session提供,只存在于Session的生命周期中。当应用程序调用Session接口的save()、update()、saveOrUpdate()、get()、load()或者Query和Criteria实例的list()、iterate()等方法时,如果Session缓存中没有相应对象,Hibernate就会把对象加入到一级缓存中。当Session关闭时,该Session所管理的一级缓存也

5、会立即被清除。 1一个session中发出两次get查询 将项目hibernate-10复制并命名为“hibernate-11”,再导入到MyEclipse开发环境中。在项目hibernate-10的测试类HibernateTest中添加testSessionCache_1()方法,并使用Test注解加以修饰,在同一个session中发出两次get查询。,Test public void testSessionCache_1() User u1=(User)session.get(User.class, 1); System.out.println(“用户名:“+u1.getLoginName

6、(); User u2=(User)session.get(User.class, 1); System.out.println(“用户名:“+u2.getLoginName(); ,15.2 一级缓存,7,2开启两个session中发出两次get查询 在测试类HibernateTest中添加testSessionCache_2()方法,并使用Test注解加以修饰,开启两个session中发出两次get查询。,Test public void testSessionCache_2() User u1=(User)session.get(User.class, 1); System.out.pr

7、intln(“用户名:“+u1.getLoginName(); mit(); session.close(); session=sessionFactory.openSession(); transaction=session.beginTransaction(); User u2=(User)session.get(User.class, 1); System.out.println(“用户名:“+u2.getLoginName(); ,15.2 一级缓存,8,3在一个Session中先save,再执行load查询 在测试类HibernateTest中添加testSessionCache_3

8、()方法,并使用Test注解加以修饰,在一个session中先执行save操作,再执行load查询。 Session接口为应用程序提供了两个管理缓存的方法:evict()方法和clear()方法。其中evict()方法用于将某个对象从Session的一级缓存中清除;clear()方法用于将一级缓存中的所有对象全部清除。 在测试类HibernateTest中添加testSessionCacheClear()方法,并使用Test注解加以修饰,在同一个Session中先调用load查询,然后执行clear()方法,最后再调用load查询。,Test public void testSessionCa

9、che_3() User user=new User(“NewUser“,“123456“,“新用户“); Serializable id=session.save(user); User u=(User)session.get(User.class, id); System.out.println(“用户名:“+u.getLoginName(); ,Test public void testSessionCacheClear() User u1=(User)session.get(User.class, 1); System.out.println(“用户名:“+u1.getLoginNam

10、e(); User u2=(User)session.get(User.class, 1); session.clear(); System.out.println(“用户名:“+u2.getLoginName(); ,15.3,二级缓存,9,15.3 二级缓存,10,二级缓存是一个可插拔的缓存插件,它是由SessionFactory负责管理。由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此二级缓存是进程范围或者集群范围的缓存。 与一级缓存一样,二级缓存也根据对象的ID来加载缓存。当执行某个查询获得的结果集为实体对象集时,Hibernate就会把它们按照对象ID加载

11、到二级缓存中。在访问指定ID的对象时,首先从一级缓存查找,找到直接使用,找不到转到二级缓存查找(必须配置且启用二级缓存)。如果二级缓存中找到,则直接使用,否则会查询数据库,并将查询结果根据对象的Id放到缓存中。 1常用的二级缓存插件 Hibernate的二级缓存功能是通过配置二级缓存插件来实现的,常用的二级缓存插件包括EHCache、OSCache、SwarmCache和JBossCache。,15.3 二级缓存,11,2Hibernate使用EHCache的步骤 (1) 引入EHCache相关的jar包 引入hibernate-release-5.2.6.Finalliboptionaleh

12、cache目录下的ehcache-core-2.10.3.jar、hibernate-ehcache-5.2.6.Final.jar、slf4j-api-1.7.7.jar三个jar包。 (2) 创建EHCache的配置文件ehcache.xml 可直接拷贝hibernate-release-5.2.6.Finalprojectetc ehcache.xml拷贝到项目hibernate-11的src目录下。 (3) 在Hibernate配置文件里面启用EHCache 在hibernate.cfg.xml配置文件中,启用EHCache。 (4) 配置哪些实体类的对象需要二级缓存 在实体类的映射文

13、件中配置并发访问策略 在Hibernate配置文件中统一配置(推荐使用), true org.hibernate.cache.ehcache.EhCacheRegionFactory, ,元素的后面 ,15.3 二级缓存,12,3实体对象级别的二级缓存测试 二级缓存配置好后,再次执行测试类HibernateTest中的testSessionCache_2()方法,看执行结果。 4使用collection-cache配置集合级别的二级缓存 在测试类HibernateTest中添加testSecondCache()方法,并使用Test注解加以修饰,查看执行结果。 在hibernate.cfg.xm

14、l文件中使用元素来配置Mealseries类的对象的二级缓存,再执行testSecondCache()方法,查看执行结果。 在hibernate.cfg.xml文件中使用元素来配置集合mealSet的二级缓存,再执行testSecondCache()方法,查看执行结果。 在hibernate.cfg.xml文件中元素来配置Meal类的对象的二级缓存,再执行testSecondCache()方法,查看执行结果。,控制台输出结果: Hibernate: select from restrant.users user0_ where user0_.Id=? 用户名:zhangsan 用户名:zhan

15、gsan 第一次执行get方法查询出结果后,关闭了session,一级缓存被清除了,由于配置并启用了二级缓存,查询出的结果会放入二级缓存。第二次执行get方法时,首先从一级缓存中查找,没有找到;然后转到二级缓存查找,二级缓存中找到结果,不需要从数据库查询。,Test public void testSecondCache() Mealseries ms1 = (Mealseries) session.get(Mealseries.class, 1); System.out.println(“菜系:“+ms1.getSeriesName(); System.out.println(“数量:“+m

16、s1.getMealSet().size(); mit(); session.close(); session=sessionFactory.openSession(); transaction=session.beginTransaction(); Mealseries ms2 = (Mealseries) session.get(Mealseries.class, 1); System.out.println(“菜系:“+ms2.getSeriesName(); System.out.println(“数量:“+ms2.getMealSet().size(); ,Hibernate: 菜系:鲁菜 Hibernate: 数量:9 Hibernate: 菜系:鲁菜 Hibernate: 数量:9 第一次执行get方法加载SeriesId=1的M

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号