版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第15章使用Hibernate
缓存数据
2021/5/91目录12缓存的概念和范围一级缓存34二级缓存查询缓存2021/5/9215.1缓存的概念和范围2021/5/9315.1缓存的概念和范围缓存的介质一般是内存,所以读写速度很快。但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质。缓存的实现不仅仅要考虑存储的介质,还要考虑到管理缓存的并发访问和缓存数据的生命周期。Hibernate的缓存包括Session的缓存和SessionFactory的缓存,其中SessionFactory的缓存又可以分为两类:内置缓存和外置缓存。Session的缓存是内置的,不能被卸载,也被称为Hibernate的第一级缓存。SessionFactory的缓存又被称为Hibernate二级缓存。Hibernate缓存的范围包括事务范围、进程范围和集群范围,具体如下:(1)事务范围:(2)进程范围:(3)集群范围:Hibernate提供的一级缓存是一个线程对应一个session,一个线程可以看成一个用户。也就是说session级缓存(一级缓存)只能给一个线程用,别的线程用不了,一级缓存就是和线程绑定了。Hibernate一级缓存生命周期很短,和session生命周期一样,一级缓存也称session级的缓存或事务级缓存。如果事务提交或回滚了,我们称session就关闭了,生命周期结束了。Hibernate二级缓存需要sessionFactory来管理,它是进初级的缓存,所有人都可以使用,它是共享的。使用缓存,肯定是长时间不改变的数据,如果经常变化的数据放到缓存里就没有太大意义了。因为经常变化,还是需要经常到数据库里查询,那就没有必要用缓存了。(1)事务范围:缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期,当事务结束时,缓存也就结束生命周期。在此范围下,缓存的介质是内存。(2)进程范围:缓存被进程内的所有事务共享。这些事务有可能是并发访问缓存,因此必须对缓存采取必要的事务隔离机制。(3)集群范围:在集群环境中,缓存被一个机器或者多个机器的进程共享。缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中的数据一致性,缓存中的数据通常采用对象的松散数据形式。2021/5/9415.2一级缓存2021/5/9515.2一级缓存Hibernate的一级缓存由Session提供,只存在于Session的生命周期中。当应用程序调用Session接口的save()、update()、saveOrUpdate()、get()、load()或者Query和Criteria实例的list()、iterate()等方法时,如果Session缓存中没有相应对象,Hibernate就会把对象加入到一级缓存中。当Session关闭时,该Session所管理的一级缓存也会立即被清除。1.一个session中发出两次get查询将项目hibernate-10复制并命名为“hibernate-11”,再导入到MyEclipse开发环境中。在项目hibernate-10的测试类HibernateTest中添加testSessionCache_1()方法,并使用@Test注解加以修饰,在同一个session中发出两次get查询。
@Test
public
voidtestSessionCache_1(){Useru1=(User)session.get(User.class,1);System.out.println("用户名:"+u1.getLoginName());Useru2=(User)session.get(User.class,1);System.out.println("用户名:"+u2.getLoginName());}2021/5/9615.2一级缓存2.开启两个session中发出两次get查询
在测试类HibernateTest中添加testSessionCache_2()方法,并使用@Test注解加以修饰,开启两个session中发出两次get查询。
@Test
public
voidtestSessionCache_2(){Useru1=(User)session.get(User.class,1);System.out.println("用户名:"+u1.getLoginName());mit();
session.close();
session=sessionFactory.openSession();
transaction=session.beginTransaction();Useru2=(User)session.get(User.class,1);System.out.println("用户名:"+u2.getLoginName());}2021/5/9715.2一级缓存3.在一个Session中先save,再执行load查询
在测试类HibernateTest中添加testSessionCache_3()方法,并使用@Test注解加以修饰,在一个session中先执行save操作,再执行load查询。Session接口为应用程序提供了两个管理缓存的方法:evict()方法和clear()方法。其中evict()方法用于将某个对象从Session的一级缓存中清除;clear()方法用于将一级缓存中的所有对象全部清除。在测试类HibernateTest中添加testSessionCacheClear()方法,并使用@Test注解加以修饰,在同一个Session中先调用load查询,然后执行clear()方法,最后再调用load查询。
@Test
public
voidtestSessionCache_3(){Useruser=newUser("NewUser","123456","新用户");Serializableid=session.save(user);Useru=(User)session.get(User.class,id);System.out.println("用户名:"+u.getLoginName());}
@Test
public
voidtestSessionCacheClear(){Useru1=(User)session.get(User.class,1);System.out.println("用户名:"+u1.getLoginName());Useru2=(User)session.get(User.class,1);
session.clear();System.out.println("用户名:"+u2.getLoginName());}2021/5/9815.3
二级缓存2021/5/9915.3二级缓存二级缓存是一个可插拔的缓存插件,它是由SessionFactory负责管理。由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此二级缓存是进程范围或者集群范围的缓存。与一级缓存一样,二级缓存也根据对象的ID来加载缓存。当执行某个查询获得的结果集为实体对象集时,Hibernate就会把它们按照对象ID加载到二级缓存中。在访问指定ID的对象时,首先从一级缓存查找,找到直接使用,找不到转到二级缓存查找(必须配置且启用二级缓存)。如果二级缓存中找到,则直接使用,否则会查询数据库,并将查询结果根据对象的Id放到缓存中。1.常用的二级缓存插件Hibernate的二级缓存功能是通过配置二级缓存插件来实现的,常用的二级缓存插件包括EHCache、OSCache、SwarmCache和JBossCache。2021/5/91015.3二级缓存2.Hibernate使用EHCache的步骤(1)引入EHCache相关的jar包引入hibernate-release-5.2.6.Final\lib\optional\ehcache目录下的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.Final\project\etc\ehcache.xml拷贝到项目hibernate-11的src目录下。(3)在Hibernate配置文件里面启用EHCache在hibernate.cfg.xml配置文件中,启用EHCache。(4)配置哪些实体类的对象需要二级缓存
在实体类的映射文件中配置并发访问策略
在Hibernate配置文件中统一配置(推荐使用)<ehcache><diskStorepath="java.io.tmpdir"/><defaultCachemaxElementsInMemory="10000"eternal="false"timeToIdleSeconds="120"timeToLiveSeconds="120"overflowToDisk="true"/><cachename="sampleCache1"maxElementsInMemory="10000"eternal="false"timeToIdleSeconds="300"timeToLiveSeconds="600"overflowToDisk="true"/><cachename="sampleCache2"maxElementsInMemory="1000"eternal="true"timeToIdleSeconds="0"timeToLiveSeconds="0"overflowToDisk="false"/></ehcache><!--启用二级缓存--><propertyname="hibernate.cache.use_second_level_cache">true</property><!--设置二级缓存插件EHCache的Provider类--><propertyname="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property><hibernate-mappingpackage="com.hibernate.entity"><classname="User"table="users"catalog="restrant">
<cacheusage="read-write"/><idname="id"type="java.lang.Integer"><columnname="Id"/><generatorclass="native"></generator></id>
……</class></hibernate-mapping><!--二级缓存的要求必须放在所有<mapping>元素的后面--><class-cacheusage="read-write"class="com.hibernate.entity.User“/>2021/5/91115.3二级缓存3.实体对象级别的二级缓存测试二级缓存配置好后,再次执行测试类HibernateTest中的testSessionCache_2()方法,看执行结果。4.使用collection-cache配置集合级别的二级缓存
在测试类HibernateTest中添加testSecondCache()方法,并使用@Test注解加以修饰,查看执行结果。在hibernate.cfg.xml文件中使用<class-cache>元素来配置Mealseries类的对象的二级缓存,再执行testSecondCache()方法,查看执行结果。
在hibernate.cfg.xml文件中使用<collection-cache>元素来配置集合mealSet的二级缓存,再执行testSecondCache()方法,查看执行结果。
在hibernate.cfg.xml文件中<class-cache>元素来配置Meal类的对象的二级缓存,再执行testSecondCache()方法,查看执行结果。控制台输出结果:Hibernate:select…fromrestrant.usersuser0_whereuser0_.Id=?用户名:zhangsan用户名:zhangsan
第一次执行get方法查询出结果后,关闭了session,一级缓存被清除了,由于配置并启用了二级缓存,查询出的结果会放入二级缓存。第二次执行get方法时,首先从一级缓存中查找,没有找到;然后转到二级缓存查找,二级缓存中找到结果,不需要从数据库查询。@Testpublic
voidtestSecondCache(){Mealseriesms1=(Mealseries)session.get(Mealseries.class,1);System.out.println("菜系:"+ms1.getSeriesName());System.out.println("数量:"+ms1.getMealSet().size());mit();session.close();session=sessionFactory.openSession();transaction=session.beginTransaction();Mealseriesms2=(Mealseries)session.get(Mealseries.class,1);System.out.println("菜系:"+ms2.getSeriesName());System.out.println("数量:"+ms2.getMealSet().size());}Hibernate:……菜系:鲁菜Hibernate:……数量:9Hibernate:……菜系:鲁菜Hibernate:……数量:9
第一次执行get方法加载SeriesId=1的Mealseries对象ms1时发出第一条SQL语句;执行ms1.getMealSet()时发出第二条SQL语句,之后关闭session,一级缓存被清除了。由于此时没有针对Mealseries类配置二级缓存,因此第二次加载SeriesId=1的Mealseries对象ms2,执行ms2.getMealSet()时会发出第三、第四条SQL语句重新获取数据。<class-cacheusage="read-write"class="com.hibernate.entity.Mealseries"/>Hibernate:……菜系:鲁菜Hibernate:……数量:9菜系:鲁菜Hibernate:……数量:9
由于针对Mealseries类的对象配置了二级缓存,关闭session后,第二次加载SeriesId=1的Mealseries对象ms2时,可以从二级缓存中获取,因此少发出一条SQL语句。但是在执行ms2.getMealSet()时还是会发出SQL语句重新获取数据,这是因为Mealseries对象中Meal类型的集合mealSet没有配置二级缓存。<class-cacheusage="read-write"class="com.hibernate.entity.Mealseries"/> <collection-cacheusage="read-write"collection="com.hibernate.entity.Mealseries.mealSet"/><class-cacheusage="read-write"class="com.hibernate.entity.Meal"/>2021/5/91215.3二级缓存5.基于硬盘的二级缓存
在配置文件ehcache.xml中,首先修改<diskStore>元素配置,指定EHCache把数据写入磁盘时的目录(非系统盘)。<diskStorepath="E:\\EHCache"/>
修改ehcache.xml中原先的命名缓存区域sampleCache1和sampleCache2,为每个缓存区域设置不同的缓存策略。
给测试类HibernateTest中用@After注解修饰的destroy()方法中的“sessionFactory.close();”语句添加断点,选中testSecondCache()方法,点右键选择“DebugAs
1JUnitTest”,以调试的方式执行测试类中的testSecondCache()方法。当程序暂停在“sessionFactory.close();”语句时,打开“E:\EHCache”,可以看到缓存到磁盘的实体类对象文件。程序执行结束后,sessionFactory关闭了,缓存到磁盘的文件就会自动被删除。<cachename="com.hibernate.entity.Meal"maxElementsInMemory="1"eternal="false"timeToIdleSeconds="300"timeToLiveSeconds="600"overflowToDisk="true"/><cachename="com.hibernate.entity.Mealseries.mealSet"maxElementsInMemory="1000"eternal="true"timeToIdleSeconds="0"
timeToLiveSeconds="0"overflowToDisk="false"/>2021/5/91315.4
查询缓存2021/5/91415.4查询缓存对经常使用的查询语句,如果启用了查询缓存,当第一次执行查询语句时,Hibernate会将查询结果存储
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第三方协议样签合同
- 一级护理质量评价标准
- 中海大海洋地质学课件第1章绪论-1第一讲
- 多发性硬化症症状辨析及护理要领
- 银屑病常见症状及护理经验传授
- 疼痛科疾病常见症状及护理技术
- 演员背台词训练
- 风湿热临床表现解读和护理指南
- 2025年新高考数学一轮复习收官卷01(解析版)
- 慢性肾炎常见症状及护理心法传授
- 疫情下社会行为变迁-洞察及研究
- 托育中心教师卫生保健岗位职责
- 航空母舰介绍课件
- 初二数学教研活动方案
- GB/T 33523.700-2025产品几何技术规范(GPS)表面结构:区域法第700部分:区域形貌测量仪器的校准、调整和验证
- 人保非车险考试题及答案
- 绿色低碳建筑设计 课件全套 第1-8章 绿色低碳建筑设计概论-实践案例分析
- 老年康复医院建设项目可行性研究报告(专业完整版)
- 中国经济背景下的房地产企业整合方案研究
- 基于草酸和柠檬酸的功能化聚酯的设计、制备和性能研究
- 2025年福建厦门高三一模高考数学试卷试题(含答案详解)
评论
0/150
提交评论