hibernate一级缓存和快照

摘自网络:       

Hibernate中的一级缓存的底层是以Map形式存在的,key是主键,value是对象,所以它的泛型为Map<Serializable,Object>,key的泛型为串行化是因为主键都可被序列化。简单说完一级缓存的底层原理,下面开始讲快照问题。
当程序调用get()方法时,Session会先在缓存区找有没有存在对应的对象,如果是第一次调用,这时缓存区是空的,自然就找不到,那么Session就会发送select语句向数据库查找,数据找到后将结果返回给Session,这时Session会对数据进行组装成实体对象,并且一式两份,即一份在缓存中,一份是快照,然后Session会将缓存中的那一份返回给程序;如果这时进行更新操作,那么在Session中会进行对比缓存中的对象与快照中的对象,如果对象的属性发生了变化,那么就会发送update语句对数据库进行更新,如果对象的属性没有变化,则不发送update语句。
总结,快照是数据库的数据在Session中的代表,也就是说,数据库中的数据一旦发生变化,快照就会随之改变。个人觉得这样设计能减少对数据库的访问,提高数据库的效率。
 hibernate存在2个缓存

  第一级别的缓存是 Session 级别的缓存,它是属于事务范围的缓存(session的一级缓存)

  第二级别的缓存是 SessionFactory 级别的缓存,它是属于进程范围的缓存(二级缓存

session的一级缓存

   使用hibernate进行查询的时候,将查询结果放置到session的一级缓存中,在一级缓存中存在对象,对象使用属性的OID的值进行区分,此时再使用相同的OID进行查询的时候,首先会在session一级缓存中进行查找是否存在相同的OID

    如果存在相同的OID,此时不再查询数据库,而是直接使用一级缓存中存在的对象
    如果没有存在相同的OID,此时再查询数据库,将查询得到的结果数据再放置到session一级缓存中

目的:减少访问数据库的次数

session的快照

使用id进行查询数据库,将查询得到的结果放置到session一级缓存中,同时复制一份数据,放置到session的快照中

当使用tr.commit()的时候,同时清理session的一级缓存(flush)

当清理session一级缓存的时候,会使用OID判断一级缓存中对象和快照中的对象进行比对

    如果2个对象(一级缓存的对象和快照的对象)中的属性发生变化,则执行update语句,此时更新数据库,更新成一级缓存中的数据
    如果2个对象中的属性不发生变化,此时不执行update语句

目的:确保和数据库中的数据一致                                                            

Session二级缓存

   一个可配置的缓存插件,包括类级别的缓存区域,集合级别的缓存区域,查询级别的缓存区域,时间戳级别的缓存区域

其使用步骤大致如下:

1 拷贝ehcache-1.5.0.jar到当前工程的lib目录下

2 开启二级缓存

   <property name="hibernate.cache.use_second_level_cache">true</property>

3 要指定缓存的供应商

   <property name="hibernate.cache.provider_class">

              org.hibernate.cache.EhCacheProvider</property>

4 指定使用二级缓存的类

    方法一 在使用类的*.hbm.xml配置

选择需要使用二级缓存的持久化类, 设置它的二级缓存的并发访问策略, <class> 元素的 cache 子元素表明 Hibernate 会缓存对象的简单属性, 但不会缓存集合属性, 若希望缓存集合属性中的元素, 必须在 <set> 元素中加入 <cache> 子元素

   方法二  在hibernate.cfg.xml文件中配置(建议)

      <!-- 指定使用二级缓存的类放在maping下面 -->

      <!-- 配置类级别的二级缓存 -->

      <class-cache class="cn.itcast.c3p0.Customer" usage="read-write"/>

      <class-cache class="cn.itcast.c3p0.Order" usage="read-write"/>

    <!-- 配置集合级别的二级缓存 -->

    <collection-cache  collection="cn.itcast.c3p0.Customer.orders"

                                   usage="read-write"/>

5  配置ehcache默认的配置文件ehcache.xml(名字固定)(放在类路径下)

hibernate中一级缓存、快照、二级缓存面试的时候问得比较多。

原文地址:https://www.cnblogs.com/Danial7777777/p/9348210.html

时间: 2024-10-20 14:59:46

hibernate一级缓存和快照的相关文章

框架 day32 Hibernate,一级缓存,关联关系映射(一对多,多对多)

一级缓存 概念 *在 Session 接口的实现中包含一系列的 Java 集合, 这些 Java集合构成了Session缓存. 只要 Session 实例没有结束生命周期, 存放在它缓存中的对象也不会结束生命周期 *当session的save()方法持久化一个对象时,该对象被载入缓存, 以后即使程序中不再引用该对象,只要缓存不清空,该对象仍然处于生命周期中. 当试图get(). load()对象时,会判断缓存中是否存在该对象,有则返回,此时不查询数据库.没有再查询数据库 *Session 能够在

hibernate 一级缓存和二级缓存

hibernate一级缓存:session缓存即事务级缓存,session关闭,缓存自动销毁,开发人员不用管理,由hibernate管理,save.update.saveoOrUpdate.lock.load.list会自动向一级缓存中存放数据,get,load,list会自动从一级缓存中取数据,可调用evict(Object object)和clear()清除缓存. hibernate二级缓存:sessionFactory缓存即进程级别缓存,由缓存插件实现,如OSCache,对hibernat

(10)Hibernate一级缓存

1.为什么要用缓存? 目的:减少对数据库的访问次数!从而提升hibernate的执行效率! 2.Hibernate中缓存分类 一级缓存.二级缓存 3.一级缓存的概念 1)Hibenate中一级缓存,也叫做session的缓存,它可以在session范围内减少数据库的访问次数!  只在session范围有效! Session关闭,一级缓存失效! 2)当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session的缓存中

转载 hibernate一级缓存和二级缓存的区别

文章来源:http://blog.csdn.net/defonds/article/details/2308972     hibernate一级缓存和二级缓存的区别 缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据. 缓存的介质一般是内存,所以读写速度很快.但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质.

Hibernate一级缓存(补)

------------------siwuxie095 什么是缓存 缓存是介于应用程序和永久性数据存储源(如:硬盘上的文件 或 数据库) 之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提 高应用的运行性能 针对数据库,则: 数据是存到数据库中的,而数据库本身也是文件系统,使用流方式操作文 件的效率并不是很高 如果把数据存到内存里面,不需要使用流方式,就可以直接读取内存中的 数据,提高读取的效率 Hibernate 缓存 1.Hibernate 框架中提供了很多优化方式,Hibe

hibernate一级缓存,二级缓存和查询缓存

一级缓存 (必定存在)  session里共享缓存,伴随session的生命周期存在和消亡: 1. load查询实体支持一级缓存 2. get查询实体对象也支持 3. save保存的实体对象会缓存在一级缓存 4. clear evict会清除session缓存 5. save巨大数据,每20个数据,一般flush执行sql将数据持久化然后clear缓存,防止内存溢出,save放最后. 6. iterate使用一级缓存(creatQuery中的查询实体对象list会使用一级缓存,查询对象实体属性不

Hibernate一级缓存

1.三种查询方式: 1.1.HQL语句:批量查询时,查询结果会进入缓存中.(先查询list,再查询单条记录,只打印一条语句),HQL不会使用一级缓存.(重复的查询,结果只打印一条SQL) 1.2.SQL查询:如果把查询结果封装到对象中,对象会放入到一级缓存中,如果没有将查询结果放到对象中,不会放到一级缓存中 1.3.criteria查询:会将查询结果放入到一级缓冲中,但是查询不会使用一级缓存(与HQL查询的结论相似) 2.缓存中的数据与数据库中的不同步,会优先使用缓存中的. 使用JDBC,在一级

(五)Hibernate一级缓存

一.简介 缓存,介于应用程序和永久数据存储源之间,作用是为了降低应用程序对物理数据源访问的频率,从而提高应用的运行性能. 例如我们cpu执行效率每秒处理的数据高达上千兆,而我们的硬盘读取速度却没那么高,读取几百兆,这时候我们使用缓存来存储数据,存储满后一次性交由cpu处理. Hibernate中也存在缓存,同样是为了提高效率.Hibernate的缓存包括Session的缓存和SessionFactory的缓存. Session的缓存是内置的,不能被卸载,也被称为Hibertnate的一级缓存.

hibernate 一级缓存

一级缓存 为什么要用缓存? 目的:减少对数据库的访问次数!从而提升hibernate的执行效率! Hibernate中缓存分类: 一级缓存 二级缓存 概念 1)Hibenate中一级缓存,也叫做session的缓存,它可以在session范围内减少数据库的访问次数!  只在session范围有效! Session关闭,一级缓存失效! 2)当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session的缓存中. 3)S