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)一级缓
-
Java面试题:Hibernate的二级缓存与Hibernate多表查询我们来看两个有关Java框架之Hibernate的面试题,这是关于Hibernate的常考知识点。1、请介绍一下Hibernate的二级缓存解题按照以下思路来回答:(1)首先说清楚什么是缓存;(2)再说有了hibernate的Session就是一级缓存,即有了一级缓存,为什么还要有二级缓存;(3)最后再说如何配置Hibernate的二级缓存。缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中(一个数据结构中),这个数据结构通常是或类似Hashmap,当以后要使用某个对象时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用。下面是缓存的伪代码:引出hibernate的第二级缓存,用下面的伪代码分析了Cache的实现原理。Dao{hashmap map =new map();User getUser(integer id){User user = map.get(id)if(user ==null){user = session.
hibernate的缓存机制相关课程
-
Mybatis缓存详解 基于mybatis 3.5.1版本,全面介绍mybatis一级缓存、二级缓存以及自定义缓存的使用方法、实现原理、应用场景、优缺点等,并进行现场验证
讲师:西昆仑 初级 7503人正在学习
-
Bitmap高效缓存 本门课程会介绍Bitmap相关知识点及如何高效加载,还会介绍Android缓存策略,通过综合前面所学模仿ImageLoader实现图片高效加载功能。
讲师:qndroid 中级 6703人正在学习
hibernate的缓存机制相关教程
- 2.2 Hibernate 中的为什么需要缓存 要搞清楚 Hibernate 为什么需要缓存,那就要了解 Hibernate 使用缓存做什么?Hibernate 的任务是帮助开发者发送 SQL 语句,从数据库中获取数据。这个过程并不轻松。从微观角度上讲,Hibernate 要背上行李,通过纵横交织的网络交通,到达数据库服务器,获取数据。然后背起数据,继续行走在四通八达的网络交通,回到程序中。运气不好时,碰到网络拥堵,就会产生延迟,遇到网络断线,则会丢失数据。理论上讲,对于每次的数据请求,这个过程都是必须的。但是,如果多次的请求是同样数据的时候,也就是用户的请求 SQL 是一样的时候,有必要这么不停地来往于数据库服务器吗?面对这种情况,Hibernate 提供的缓存就起作用了,可以缓存曾经从数据库中获取过的数据。如果下次再需要时,只需要从缓存中获取,而无需翻山涉水,通过网络获取。Hibernate 的缓存主要是存储曾经操作过的数据,程序逻辑向 Hibernate 发送数据请求操作时,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 类型的数据。
- 3. Session 缓存 Hibernate 提供有一级和二级缓存,一级缓存也叫 Session 缓存,二级缓存也叫 SessionFactory 缓存。前面课程中和大家聊过,Session 的使用原则是,需要时创建,用完后关闭,其作用域一般为方法级别。一级缓存的生命周期和 Session 是一致的,所以,一级缓存中所存储的数据其生命周期也不长,其实际意义就论情况来看了。SessionFactory 在前面也讨论过,SessionFactory 是应用程序级别的生命周期,所以与其关联的缓存中所保存的数据也可以长时间存在。默认情况下,Hibernate 的一级缓存是可以直接使用的,二级缓存是没有打开的。需要根据实际情况进行选择。
- 2. Hibernate 中的隔离机制 如前面课程所述,隔离机制能保证事务之间的良好秩序,但是,太严格的隔离机制会让事务之间产生时间上的等待或延迟,也就是说并发性弱。太松散的隔离机制,虽然可以增加并发性,但可能会产生事务之间的数据脏读等一系列不希望出现的事情。有时,纯粹地依靠 JDBC 提供的 4 种隔离机制很难做到隔离的优雅性,所以,一般采用 读取已提交 或者 更低的事务隔离级别,再配合各种并发访问控制策略来达到并发事务控制的目的。Hibernate 中如何设置隔离机制?这个问题很简单,你要做的就是在 Hibernate 主配置文件中添加如下信息:<property name="connection.isolation">2</property>这里的 2 是什么意思?是这样的,Hibernate 使用 1 、2 、4 、8 这几个数字分别代表 4 种隔离机制。8 - Serializable 串行化;4 - Repeatable Read 可重复读;2 - Read Commited 可读已提交;1 - Read Uncommited 可读未提交。使用数字有几个好处,毕竟不用记那么一长串字符串,最主要的是,这几个数字可以换算成 二进制中的 0001、0010、0100、1000。可以直接通过二进制位运算的方式进行权限控制。设置就是这么简单,但是,这还不够。刚说过, 最好再配合并发控制策略。那么, Hibernate 提供了怎样的 策略,告诉你,有 2 种 “锁” 机制:乐观锁;悲观锁。你是喜欢先苦后甜还是先甜后苦了,我喜欢先苦后甜。好吧,先讲解什么是悲观锁。
- 2.6 缓存的使用 Session 级别缓存的应用价值不大,使用 Session 操作完毕后,尽可能进行缓存清理。SessionFactory 二级缓存需要打开后才能使用,而且一般是依赖第三方插件。缓存可以提高查询数据的速度,但是缓存本身需要消耗资源,所以,缓存的使用需要酌情考虑。这里有坑就是不要滥用缓存,需要缓存的对象也是需要特别指定的。如此繁琐,相必 HIbernate 也怕你滥用缓存。
- 3. 查询缓存 是不是 list() 方法真的就不能使用缓存,而只是作为 iterator() 身后的兄弟。Hibernate 中提供的有查询缓存的概念。查询缓存只对 query.list() 方法起作用。查询缓存依赖于二级缓存,因此一定要打开二级缓存。而且,在默认情况下,查询缓存也是关闭的。
hibernate的缓存机制相关搜索
-
h1
h6
hack
hadoop
halt
hana
handler
hanging
hash
hashtable
haskell
hatch
hbase
hbuilder
hdfs
head
header
header php
headers
headerstyle