hibernate缓存机制
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于hibernate缓存机制内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在hibernate缓存机制相关知识领域提供全面立体的资料补充。同时还包含 h6、hack、hadoop 的知识内容,欢迎查阅!
hibernate缓存机制相关知识
-
在Hibernate中详谈一级缓存在学习Hibernate的过程中我们肯定会碰上一个名词---缓存,一直都听说缓存机制是Hibernate中的一个难点,它分为好几种,有一级缓存,二级缓存和查询缓存 今天呢,我就跟大家分享分享我所理解的一级缓存 要想完美的体现出缓存机制的话,我想通过查询语句生成的sql应该就能够很清楚的看到 那些Hibernate的配置信息我就不展示了,直接看关键代码 场景:我要查询同一个对象,查询两次,观察在不同的情况下,sql语句的生成情况 我事先准备了一个HibernateUtil工具类,具体如下 package util; i
-
分享知识-快乐自己:论Hibernate中的缓存机制Hibernate缓存缓存: 是计算机领域的概念,它介于应用程序和永久性数据存储源之间。缓存: 一般人的理解是在内存中的一块空间,可以将二级缓存配置到硬盘。用白话来说,就是一个存储数据的容器。我们关注的是,哪些数据需要被放入二级缓存。缓存作用: 降低应用程序直接读写数据库的频率,从而提高程序的运行性能。缓存中的数据是数据存储源中数据的拷贝。缓存的物理介质通常是【内存】。Hibernate缓存分类:1):Session缓存(又称作事务缓存):Hibernate内置的,不能卸除。缓存范围: 缓存只能被当前Session对象访问。 缓存的生命周期依赖于Session的生命周期,当Session被关闭后,缓存也就结束生命周期。2):SessionFactory缓存(又称作应用缓存):使用第三方插件,可插拔。缓存范围: 缓存被应用范围内的所有session共享,不同的Session可以共享。 这些session有可能是并发访问缓存,因此必须对缓存进行更新。 缓存的生命周期依赖于应用的生命周期,应用结束
-
概述Hibernate的缓存问题1.hibernate对数据的操作是封装在tranction中,保存对象时,如果不开启事物,并且手动提交事物,对象不会真正的保存在数据库中 2.hibernate的缓存策略 (1)hibernate的缓存是提升和优化Hibernate执行效率的重要手段 (2)缓存:为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能的一种策略。 (3)hibernate一级缓存:又称为“Session”缓存,通过Session从数据库查询实体时存储起来,下一次查询同一实体时不再从数据库获取,而从内存中获取,这就是缓存。 (4)一级缓
-
Hibernate一级缓存测试分析Hibernate 一级缓存测试分析Hibernate的一级缓存就是指Session缓存,此Session非http的session会话技术,可以理解为JDBC的Connection,连接会话,Session缓存就是一块内存空间,用来存放相互管理的java对象,在使用Hibernate查询对象的时候,首先使用对象的OID(Object ID)在Hibernate 的一级缓存空间进行查找,如果通过OID匹配到了对象,就直接从一级缓存中取出使用,如果没有找到匹配该OID值的对象,这才会进行查询数据库。当从数据库中查询数据的时候,该数据就会被放入到Session缓存中,目的就是为了减少数据库的访问次数,从而提高性能。Hibernate缓存特点当应用程序调用Session接口的 save(), update(), saveOrUpdate() 时候,如果缓存中没 有相应的对象,Hb就会自动的把查询信息加入到缓存。当应用程序调用Session接口的 load(), get(), list() 等查询方法的时候,会进行
hibernate缓存机制相关课程
-
Mybatis缓存详解 基于mybatis 3.5.1版本,全面介绍mybatis一级缓存、二级缓存以及自定义缓存的使用方法、实现原理、应用场景、优缺点等,并进行现场验证
讲师:西昆仑 初级 7503人正在学习
-
Bitmap高效缓存 本门课程会介绍Bitmap相关知识点及如何高效加载,还会介绍Android缓存策略,通过综合前面所学模仿ImageLoader实现图片高效加载功能。
讲师:qndroid 中级 6703人正在学习
-
近距离探索memcache缓存 memcache是PHP中使用比较广泛的缓存系统,也是提升系统性能必不可少的组件。本课程带你从零开始接触memcache从安装到配置到使用到提高。
讲师:李虎头 中级 30390人正在学习
hibernate缓存机制相关教程
- 启动二级缓存 在 Hibernate 的主配置文件中启动并指定二级缓存的实现者;<property name="cache.use_structured_entries">true</property><property name="cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>添加 EhCache 相关的 JAR 包。这些 JAR 包都可以在下载的 Hibernate 框架包的 lib 文件夹中找到;ehcache-core-2.4.3.jar;hibernate-ehcache-4.2.0.Final.jar。在项目的 src 中添加 EhCache 缓存框架的配置文件 ehcache.xml;这个配置文件可以在下载的 Hibernate 框架包中的 project 目录下的 etc 中找到。此配置文件中的内容用来配置缓存管理相关信息。<ehcache> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" /> </ehcache> 配置说明:maxElementsInMemory: 缓存最大数目;eternal : 缓存是否持久;overflowToDisk : 是否保存到磁盘,当系统当机时;timeToIdleSeconds : 当缓存闲置 n 秒后销毁;timeToLiveSeconds : 当缓存存活 n 秒后销毁。在需要缓存的实体类上添加 @cache 注解 @Cache(usage=CacheConcurrencyStrategy.TRANSACTIONAL,include="all",region="student") 只有被 @Cache 注解的实体才会被存储进二级缓存中,此注解有一个 usage 属性,用来配置缓存的策略,是一个枚举类型,有如下几种选择:CacheConcurrencyStrategy.NONE;CacheConcurrencyStrategy.NONSTRICT_READ_WRITE: 非严格读写缓存;CacheConcurrencyStrategy.READ_ONLY: 只读缓存;CacheConcurrencyStrategy.READ_WRITE: 读写缓存;CacheConcurrencyStrategy.TRANSACTIONAL: 事务缓存。Region 指定二级缓存中的区域名,默认为类或者集合的名字。include 有几个选项,non-lazy 当属性延迟抓取打开时,标记为 lazy=“true” 的实体的属性可能无法被缓存。做完上面的事情后,再执行前面的两个 Session 对象查询同一个学生的代码,再查看控制台上的信息:Hibernate: select student0_.stuId as stuId1_1_0_, student0_.classRoomId as classRoo5_1_0_, student0_.stuName as stuName2_1_0_, student0_.stuPassword as stuPassw3_1_0_, student0_.stuSex as stuSex4_1_0_ from Student student0_ where student0_.stuId=?学生姓名:Hibernate--------------第二次查询------------------学生姓名:Hibernate第一次查询时,需要发送 SQL 请求,第二查询时,不再发送 SQL 请求,因为查询过的信息已经被存储在了二级缓存中,Hibernate 会直接从缓存查询。二级缓存并不支持缓存 Blob 类型的数据。
- 2.2 Hibernate 中的为什么需要缓存 要搞清楚 Hibernate 为什么需要缓存,那就要了解 Hibernate 使用缓存做什么?Hibernate 的任务是帮助开发者发送 SQL 语句,从数据库中获取数据。这个过程并不轻松。从微观角度上讲,Hibernate 要背上行李,通过纵横交织的网络交通,到达数据库服务器,获取数据。然后背起数据,继续行走在四通八达的网络交通,回到程序中。运气不好时,碰到网络拥堵,就会产生延迟,遇到网络断线,则会丢失数据。理论上讲,对于每次的数据请求,这个过程都是必须的。但是,如果多次的请求是同样数据的时候,也就是用户的请求 SQL 是一样的时候,有必要这么不停地来往于数据库服务器吗?面对这种情况,Hibernate 提供的缓存就起作用了,可以缓存曾经从数据库中获取过的数据。如果下次再需要时,只需要从缓存中获取,而无需翻山涉水,通过网络获取。Hibernate 的缓存主要是存储曾经操作过的数据,程序逻辑向 Hibernate 发送数据请求操作时,Hibernate 会先查询缓存中有没有,如果存在,则直接从缓存中获取,没有时,才会行走于网络通道,从数据库中获取。
- 3. Session 缓存 Hibernate 提供有一级和二级缓存,一级缓存也叫 Session 缓存,二级缓存也叫 SessionFactory 缓存。前面课程中和大家聊过,Session 的使用原则是,需要时创建,用完后关闭,其作用域一般为方法级别。一级缓存的生命周期和 Session 是一致的,所以,一级缓存中所存储的数据其生命周期也不长,其实际意义就论情况来看了。SessionFactory 在前面也讨论过,SessionFactory 是应用程序级别的生命周期,所以与其关联的缓存中所保存的数据也可以长时间存在。默认情况下,Hibernate 的一级缓存是可以直接使用的,二级缓存是没有打开的。需要根据实际情况进行选择。
- 3. 查询缓存 是不是 list() 方法真的就不能使用缓存,而只是作为 iterator() 身后的兄弟。Hibernate 中提供的有查询缓存的概念。查询缓存只对 query.list() 方法起作用。查询缓存依赖于二级缓存,因此一定要打开二级缓存。而且,在默认情况下,查询缓存也是关闭的。
- 4. SessionFactory 缓存 SessionFactory 缓存也称其为二级缓存,是应用程序级别的缓存。二级缓存在默认情况下是没有启动的,如果开发者想使用二级缓存所提供的功能,则需要通过一系列的操作流程方能让其现身。Hibernate 本身也提供有二级缓存的功能模块,但只建议用于测试或学习过程。对于生产环境,Hibernae 建议使用专业的第三方缓存框架,如 EhCache 缓存框架。常用缓存框架:EhCache;OSCache;SwarmCache;JBossCache。
- 验证一级缓存 需求:在 Session 关闭之前,连续查询相同的学生两次。Session session = sessionFactory.openSession();Transaction transaction = null;Student stu = null;try { transaction = session.beginTransaction(); stu = (Student) session.get(Student.class, new Integer(1)); System.out.println(stu.getStuName()); // 查询前面查询过的学生 System.out.println("--------------第二次查询------------------"); stu = (Student) session.get(Student.class, new Integer(1)); System.out.println(stu.getStuName()); transaction.commit();} catch (Exception e) { transaction.rollback();} finally { session.close();}运行结果如下:Hibernate: select student0_.stuId as stuId1_3_0_, student0_.classRoomId as classRoo6_3_0_, student0_.stuName as stuName2_3_0_, student0_.stuPassword as stuPassw3_3_0_, student0_.stuPic as stuPic4_3_0_, student0_.stuSex as stuSex5_3_0_ from Student student0_ where student0_.stuId=?Hibernate--------------第二次查询------------------Hibernate从输出结果中能得到什么结论?只有在第一次查询的时候,Hibernate 才会向数据库发送 SQL 语句请求,第二查询时,不需要再发送 SQL 请求,因为缓存中已经存在。稍微改动一下上述实例,创建两个 Session 对象,用来查询同一个学生:Session session = sessionFactory.openSession();Transaction transaction = null;Student stu = null;try { transaction = session.beginTransaction(); System.out.println("--------------第一次查询------------------"); stu = (Student) session.get(Student.class, new Integer(1)); System.out.println(stu.getStuName());} catch (Exception e) { transaction.rollback();} finally { session.close();}session = sessionFactory.openSession();try { transaction = session.beginTransaction(); // 查询前面查询过的学生 System.out.println("--------------第二次查询------------------"); stu = (Student) session.get(Student.class, new Integer(1)); System.out.println(stu.getStuName()); transaction.commit();} catch (Exception e) { transaction.rollback();} finally { session.close();}查看控制台上的输出结果:Hibernate: select student0_.stuId as stuId1_3_0_, student0_.classRoomId as classRoo6_3_0_, student0_.stuName as stuName2_3_0_, student0_.stuPassword as stuPassw3_3_0_, student0_.stuPic as stuPic4_3_0_, student0_.stuSex as stuSex5_3_0_ from Student student0_ where student0_.stuId=?Hibernate--------------第二次查询------------------Hibernate: select student0_.stuId as stuId1_3_0_, student0_.classRoomId as classRoo6_3_0_, student0_.stuName as stuName2_3_0_, student0_.stuPassword as stuPassw3_3_0_, student0_.stuPic as stuPic4_3_0_, student0_.stuSex as stuSex5_3_0_ from Student student0_ where student0_.stuId=?Hibernate每次查询都会发送 SQL 请求,这是因为 Session 缓存中的数据只能提供给本 Session 对象使用。不能跨 Session 使用。当调用 save ()、update () 或 saveOrUpdate () 方法传递一个对象时,或使用 load ()、 get ()、list ()、iterate () 方法获得一个对象时,该对象都将被加入到 Session 的内部缓存中;可以通过调用 close()、clear()、evict() 方法手工清空缓存中的数据。前面说过的,Session 生命周期很短,与 Session 关联的一级缓存的生命周期也很短,所以缓存的命中率是很低的。其对系统性能的改善也有限得很。Session 内部缓存的主要作用是保持 Session 内部数据状态同步。
hibernate缓存机制相关搜索
-
h1
h6
hack
hadoop
halt
hana
handler
hanging
hash
hashtable
haskell
hatch
hbase
hbuilder
hdfs
head
header
header php
headers
headerstyle