Hibernate中的缓存
一、Hiberante中常见的三大缓存:一级缓存,二级缓存和查询缓存。
Hibernate中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存是由hibernate管理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存。这一级别的缓存可以进行配 置和更改,并且可以动态加载和卸载。 Hibernate还为查询结果提供了一个查询缓存,它依赖于第二级缓存。
二、 首先需要了解的真相:
1、 缓存是数据库数据在内存中的临时容器,它包含了库表数据在内存中的临时拷贝,位于数据库和访问层之间。
2、ORM在进行数据读取时,会根据缓存管理策略,首先在缓冲中查询,如果发现,则直接使用,避免数据库调用的开销。
3、数据缓存的策略:
事务级缓存:当前事务范围内的数据缓存
应用级缓存:某个应用中的数据缓存
分布式缓存:多个应用,多个JVM之间共享缓存。分布式缓存由多个应用级缓存实例组成集群,通过某种远程机制实现各个缓存实例之间的数据同步,任何一个实例的数据修改后,将导致整个集群间的数据状态同步。
4、Hibernate的缓存在以下情况下发挥作用:
根据主键加载实体 get,load
加载关联对象
使用HQL查询时 List,iterator
5、每个事务都有单独的第一级缓存,二级缓存被同一个进程或集群范围内的所有事务共享由于每个事务都拥有单独的第一级缓存,所以一级缓存不会出现并发问题,无需 提供并发访问策略,由于多个事务会同时访问第二级缓存中相同数据,因此二级缓存必须提供适当的并发访问策略,来保证特定的事务。
6、处于一级缓存中的对象永远不会过期,除非应用程序显式清空缓存或者清除特定的对象。而二级缓存中必须提供数据过期策略,如基于内存的缓存中的对象的最大数 目,允许对象处于缓存中的最长时间,以及允许对象处于缓存中的最长空闲时间,物理存储介质可包括内存和硬盘。对象存放在基于内存的缓存中,当内存中对象的 数目达到数据过期策略中指定上限时,就会把其余的对象写入基于硬盘的缓存中。
二. 一级缓存和二级缓存比较:
一级缓存:
1、一级缓存的数据结构是Map,用于存储查询实体。Map的key存放实体的Id,Map的value存放实体本身。所以一级缓存无法存储查询的属性。
2、一级缓存的生命周期与Session有关,Session产生则一级缓存创建,Session关闭则一级缓存销毁。
3、Get,Load,Iterator方法将读写一级缓存,而List方法只写不读一级缓存。
4、一级缓存不能禁用,但可以通过Session的clear方法和evict方法清理一级缓存,从而达到禁止写缓存的效果。
5、Session的save方法会写缓存,在批量插入数据时要注意对一级缓存做定时清理。Hibernate的批量处理效率不高,建议使用Session.connection()获得Jdbc连接后使用Jdbc的相关API做批处理操作
二级缓存:
1、二级缓存也称进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享。
2、二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存。
3、Hibernate 默认情况下是打开的,提供一个Hashtable存储二级缓存,但只适用于研发,开发中为第三方缓存组件提供了接入接口,我们可以根据不同情况选择不同的实现。
4、二级缓存也只能缓存实体对象,不缓存属性。
5、ehcache二级缓存的配置和使用:
* 将echcache.xml文件拷贝到src下
* 开启二级缓存,修改hibernate.cfg.xml文件
<property name="hibernate.cache.use_second_level_cache">true</property>
* 指定缓存产品提供商,修改hibernate.cfg.xml文件
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
* 指定哪些实体类使用二级缓存(两种方法)
1)在映射文件中采用<cache>标签
2)在hibernate.cfg.xml文件中,采用<class-cache>标签
二级缓存的特性:
1、Get,Load,Iterator方法读写二级缓存,而List方法只写不读二级缓存
2、设置<property name=“hibernate.cache.use_second_level_cache”>fasle</property>可以禁用二级缓存。
3、在一次Session交互中,可以设置Session的CacheMode为Put来禁用读操作,设置CacheMode为Get来禁用写操作。
4、 也可以通过SessionFacotry的evict方法清理二级缓存来达到禁止写二级缓存的效果
查询缓存:
1、查询缓存是针对普通属性结果集的缓存,对实体对象的结果集只缓存id 。
2、查询缓存的生命周期为当前关联的表发生修改,那么查询缓存生命周期结束。
3、查询缓存的配置和使用:
* 在hibernate.cfg.xml文件中启用查询缓存,如:
<property name="hibernate.cache.use_query_cache">true</property>
* 在程序中必须手动启用查询缓存,如:
query.setCacheable(true);
4、List方法读写查询缓存,Iterator不读查询缓存 。 二级缓存和查询缓存搭配使用效果最佳
相关推荐
### 深入理解Hibernate缓存 #### 一、Hibernate缓存概述 Hibernate作为一款流行的Java持久层框架,为开发者提供了高效且灵活的数据访问能力。其中,缓存机制是Hibernate性能优化的重要组成部分之一。理解Hibernate...
Hibernate缓存机制是提高应用程序性能的关键特性,尤其是在频繁与数据库交互的应用中。缓存通过减少对物理数据库的直接访问次数,显著提升了数据读取和写入的速度。这主要是因为从缓存中读取数据比从数据库中获取更...
例如,当我们第一次从数据库加载一个实体后,再次请求该实体时,Hibernate会首先在一级缓存中查找,而不会去数据库查询,从而提高了性能。在实际项目中,合理利用一级缓存可以显著减少数据库的负载。 接下来是二级...
【Hibernate缓存深入详解】 在Java的持久化框架Hibernate中,缓存机制是提升系统性能的关键因素。它位于Hibernate应用和数据库之间,减少了对数据库的直接访问,从而提高了应用程序的运行速度。缓存中存储的是...
### Hibernate缓存技术研究 #### 一、引言 Hibernate是一种强大的对象-关系映射(Object-Relational Mapping,简称ORM)工具,主要用于Java环境下的应用程序。它能够将应用程序中的对象模型映射到关系型数据库的表...
- **数据一致性问题**:由于二级缓存中的数据是数据库数据的副本,因此需要解决数据一致性的问题。通常情况下,可以通过配置缓存策略(如读写策略、刷新策略等)来保证数据的一致性和有效性。 - **性能优化**:合理...
管理Hibernate的缓存缓存 管理Hibernate的缓存缓存
二级缓存中存储的是对象的集合数据,而不是单个对象实例,这样可以更高效地处理大量数据。二级缓存可以通过设置不同的并发访问策略来解决并发问题,如事务型、读写型或非严格读写型,以适应不同场景下的需求。 持久...
当会话关闭时,一级缓存中的数据会被清除。一级缓存的主要作用是减少对数据库的查询次数,提高应用程序的响应速度。 二级缓存是一种可选的缓存策略,用于在不同的会话之间共享数据。它通常由第三方缓存提供者(如...
当实体被持久化时,会自动放入一级缓存,读取数据时也会优先从一级缓存中查找。一级缓存默认开启且无法关闭,具有事务隔离性,即在同一个事务中修改的数据,只有在事务提交后才会对其他事务可见。 **三、二级缓存**...
Hibernate缓存.docHibernate缓存.doc
Hibernate二级缓存是一种提高应用程序性能的技术,它将数据存储在SessionFactory级别的缓存中,使得数据可以在不同的Session之间共享。这与一级缓存(Session级别)不同,一级缓存仅存在于单个Session生命周期内,当...
每当我们在Session中进行对象的CRUD(创建、读取、更新、删除)操作时,这些操作实际上并未立即同步到数据库,而是被暂时保存在一级缓存中。一级缓存的特点如下: - **生命周期与Session一致**:一级缓存的生命周期...
这篇博客文章“hibernate缓存ehcache用法”可能详细介绍了如何在Hibernate中配置和使用Ehcache。 首先,我们需要理解什么是缓存。缓存是一种存储技术,用于临时保存经常访问的数据,以减少对主存储器(如数据库)的...
当我们在Session中对对象进行操作时,如保存、更新或删除,Hibernate首先会检查这个对象是否已经在一级缓存中。如果在,那么直接在内存中处理,而不会立即触达数据库。一级缓存默认开启,且生命周期与Session相同,...
每次当我们通过Session对象进行CRUD(创建、读取、更新、删除)操作时,Hibernate都会在一级缓存中处理这些对象。例如,当你从数据库中加载一个实体时,它会被放入一级缓存;当你修改这个实体并调用flush()方法时,...
不过,list操作不会使用缓存,而iterate则会先获取所有ID,然后逐个load,如果ID已在缓存中,则从缓存获取,否则从数据库加载。使用`<cache usage="read-write">`配置,表示使用读写缓存策略,当实体被修改时,...
Hibernate缓存机制是提高应用程序性能的关键技术之一,它通过存储数据副本减少对物理数据库的访问。缓存可以分为两层:第一级缓存和第二级缓存。 **第一级缓存**是内置在Session中的,它是不可卸载的,也称为...
在Java的持久化框架Hibernate中,二级缓存是提高数据访问效率的重要机制。它是一种全局共享的、跨会话的数据存储区域,旨在减少对数据库的直接访问,从而降低系统负载,提升性能。在这个"hibernate二级缓存实例"中,...