Hibernate缓存

原创 2012年03月26日 20:10:41

        Hibernate的缓存包括Session的缓存和SessionFactory的缓存,其中SessionFactory的缓存又可以分为两类:内置缓存和外置缓存。Session的缓存是内置的,不能被卸载,也被称为Hibernate的第一级缓存。SessionFactory的内置缓存和Session的缓存在实现方式上比较相似,前者是SessionFactory对象的一些集合属性包含的数据,后者是指Session的一些集合属性包含的数据。SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句,映射元数据是映射文件中数据的拷贝,而预定义SQL语句是在Hibernate初始化阶段根据映射元数据推导出来,SessionFactory的内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预定义SQL语句,因此SessionFactory不需要进行内置缓存与映射文件的同步。SessionFactory的外置缓存是一个可配置的插件在默认情况下,SessionFactory不会启用这个插件。外置缓存的数据是数据库数据的拷贝,外置缓存的介质可以是内存或者硬盘。SessionFactory的外置缓存也被称为Hibernate的第二级缓存。

Hibernate的缓存范围

       Hibernate的一级缓存和二级缓存都位于均位于持久层,且均用于存放数据库数据的副本,最大的区别就是缓存的范围各不一样.

存的范围分为3类:

1.事务范围
        事务范围的缓存只能被当前事务访问,每个事务都有各自的缓存,缓存内的数据通常采用相互关联的对象形式.缓存的生命周期依赖于事务的生命周期,只有当事务结束时,缓存的生命周期才会结束.事务范围的缓存使用内存作为存储介质,一级缓存就属于事务范围.
2.应用范围
        应用程序的缓存可以被应用范围内的所有事务共享访问.缓存的生命周期依赖于应用的生命周期,只有当应用结束时,缓存的生命周期才会结束.应用范围的缓存可以使用内存或硬盘作为存储介质,二级缓存就属于应用范围.
3.集群范围

        在集群环境中,缓存被一个机器或多个机器的进程共享,缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中的数据的一致,缓存中的数据通常采用对象的松散数据形式.


Hibernate的二级缓存的配置
首先,不是所有的数据都适合放在二级缓存中,看一下,什么样的数据适合放在二级缓存中来?什么样的数据不适合放在二级缓存中来?

  下面这几种情况就
不适合加载到二级缓存中:
  1.经常被修改的数据
  2.绝对不允许出现并发访问的数据
  3.与其他应用共享的数据
  下面这己种情况
合适加载到二级缓存中:
  1.数据更新频率低
  2.允许偶尔出现并发问题的非重要数据
  3.不会被并发访问的数据
  4.常量数据
  5.不会被第三方修改的数据


Hibernate的二级缓存功能是靠配置二级缓存插件来实现的,Hibernate为了集成这些插件,Hibernate提供了org.hibernate.cache.CacheProvider接口,它充当缓存插件与Hibernate之间的适配器 .

常用的二级缓存插件
EHCache  org.hibernate.cache.EhCacheProvider
OSCache  org.hibernate.cache.OSCacheProvider
SwarmCahe  org.hibernate.cache.SwarmCacheProvider
JBossCache  org.hibernate.cache.TreeCacheProvider

数据放入缓存:

1. save()。当session对象调用save()方法保存一个对象后,该对象会被放入到session的缓存中。

2. get()和load()。当session对象调用get()或load()方法从数据库取出一个对象后,该对象也会被放入到session的缓存中。

3. 使用HQL和QBC等从数据库中查询数据。


hibernate.jdbc.batch_size:hibernate每次提交的sql语句数量。将多条语句一起提交,而不是单独提交以获得性能上的提高。

hibernate.jdbc.fetch_size:每次取出的数据量。


Hibernate查询缓存缓存的是查询出来的实体的部分属性结果集和实体的ID (注意这里不是实体)


hibernate的n+1问题:

1)使用懒加载

2)在*.hbm.xml中,使用fetch="join",这样hibernate会使用外连接来加载器关联实体。不过这样会让懒加载失效。


在hibernate中,update是会将数据放在缓存中的。当select的时候,也是先在缓存中查找的(此时数据库还没有做update操作)。当session关闭的时候,缓存中的数据会自动清空。此时,update操作才会发射到数据库中。

查询操作中list和iterate的区别:

1)list每次都发射sql。list会向缓存中放入数据,但是不会利用缓存

2)iterate会利用缓存。



Transient状态的对象的特性?
* 在数据库中没有与之匹配的记录
* 没有纳入session的管理

persistent状态的对象的特性?
* 纳入session的管理
* persistent状态的对象在数据库中存在与之匹配的数据
* persistent状态的对象在清理缓存(脏数据检查),会和数据库同步

detached状态的对象的特性?
* 在数据库中存在与之对应的记录
* 没有纳入session的管理

session.flush方法主要做两件事:
* 清理缓存
* 执行sql

session在什么情况下执行flush
* 默认在事务提交时
* 显示调用flush
* 在执行查询前,如:iterate

Hibernate级联保存要如何做?

Inverse是hibernate双向关系中的基本概念。inverse的真正作用就是指定由哪一方来维护之间的关联关系。当一方中指定了“inverse=false”(默认),那么那一方就有责任负责之间的关联关系,说白了就是hibernate如何生成Sql来维护关联的记录。


Hibernate延迟加载的机制是什么,如何工作?

延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载。

实体的延迟加载:

<class name=”com.neusoft.entity.User” table=”user” lazy=”true”>
集合类型的延迟加载:
<hibernate-mapping>

    <class name=”com.neusoft.entity.User” table=”user”>

…..

<set name=”addresses” table=”address” lazy=”true” inverse=”true”>

<key column=”user_id”/>

<one-to-many class=”com.neusoft.entity.Arrderss”/>

</set>

    </class>

</hibernate-mapping>
属性延迟加载:
<property name=”resume” type=”java.sql.Clob” column=”resume” lazy=”true”/>

集合延迟加载的原理看这里。讲述了hibernate如何通过代理模式来实现延迟加载(需要的时候再去取数据)。hibernate自己实现了Set、List、Map类型,并且在set中保存了session对象和集合的owner。如下图:


当延迟加载需要访问set的时候,根据owner中的外键去相应的表中查询外间关联的数据。

熟悉 Hibernate 集合属性读者应该记得:Hibernate 要求声明集合属性只能用 Set、List、Map、SortedSet、SortedMap 等接口,而不能用 HashSet、ArrayList、HashMap、TreeSet、TreeMap 等实现类,其原因就是因为 Hibernate 需要对集合属性进行延迟加载,而 Hibernate 的延迟加载是依靠 PersistentSet、PersistentList、PersistentMap、PersistentSortedMap、PersistentSortedSet 来完成的——也就是说,Hibernate 底层需要使用自己的集合实现类来完成延迟加载,因此它要求开发者必须用集合接口、而不是集合实现类来声明集合属性。延迟的关联实体将是一个动态生成代理对象。只要应用程序需要使用“暂未加载”的关联实体,Person_$$_javassist_0 代理对象会负责去加载真正的关联实体,并返回实际的关联实体——这就是最典型的代理模式。


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Hibernate 之Hibernate缓存

1、缓存:缓存是什么,解决什么问题? 位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构,均可称之为 Cache。目的:让数据更接近于应用程序,协调速度不匹配,使访问速度更快...
  • lrcoop
  • lrcoop
  • 2014-02-12 11:35
  • 2966

Hibernate(五):Hibernate缓存

一,什么是缓存?     缓存是指为了降低应用程序对物理数据源访问的频次从而提高应用程序的运行性能的一种策略,它位于应用程序和永久性数据存储源之间用于临时存放复制数据的内存区域 1.缓存的范围:缓...
  • WYFVV
  • WYFVV
  • 2017-07-27 18:32
  • 57

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

磁盘缓存、Hibernate缓存、Mybatis缓存

初步总结,后期完善

hibernate 缓存

缓存是位于应用程序与物理数据源之间,用于临时存放复制数据的内存区域,目的是为了减少应用程序对物理数据源访问的次数,从而提高应用程序的运行性能.   Hibernate在查询数据时,首先到缓存中去...

hibernate的缓存

hibernate session级缓存  在同一个session中,支持load、get、iterate 1、在同一个session中通过load或get根据id得到对象实体将使用缓存 2、在...

hibernate缓存

一.hibernate有一级缓存,二级缓存,和查询缓存。其中一二级缓存都是用来缓存对象,查询缓存是用来缓存属性。 一级 1.一级缓存的数据结构是Map,用于存储查询实体。Map的k...

Hibernate缓存

Hibernate缓存:缓存是在内存中的一块高速区域。 Hibernate缓存的作用:可以把查询出来的数据存储在内存或者磁盘,节省下次同样查询语句再次查询数据库,大幅减轻数据库压力。 在Hiber...

hibernate缓存2

四、缓存的管理   Hibernate的缓存管理 一级缓存的管理:   evit(Object obj)  将指定的持久化对象从一级缓存中清除,释放对象所占用的内存资源,指定对象从持久化状态...

hibernate 缓存

hibernate提供的一级缓存 hibernate是一个线程对应一个session,一个线程可以看成一个用户。也就是说session级缓存(一级缓存)只能给一个线程用,别的线程用不了,一级缓存就是...

hibernate缓存

缓存的作用主要是用来提高hibernate的性能,可以简单的理解成一个map。使用缓存涉及到三个操作:把数据放入缓存、从缓存中取数据、删除缓存中的无效数据。           一、一级缓存  ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)