📜  在Hibernate中缓存(1)

📅  最后修改于: 2023-12-03 14:51:16.123000             🧑  作者: Mango

在Hibernate中缓存介绍

概述

在Hibernate中缓存是提升性能的重要手段之一,可以在查询数据时减少数据库访问,提高应用程序的响应速度。在Hibernate中,缓存分为两种:一级缓存和二级缓存,其中一级缓存是与Session绑定的,而二级缓存是与SessionFactory对象绑定的全局缓存。

一级缓存

一级缓存是默认开启的,可以通过Session对象调用方法来操作。一级缓存是Session对象内部的一个Map,每次从数据库中查询数据时,都会先从缓存中查找,如果有则直接返回,否则再查询数据库,并将结果缓存下来,以备后续的查询使用。在同一个Session中,多次查询同一对象,只会发出一条SQL语句,因为所有查询都会优先从缓存中获取数据。

开启一级缓存

在配置文件中,一级缓存默认开启,因此不需要进行额外配置。但也可以在配置文件中,对一级缓存进行配置。

<property name="hibernate.cache.use_query_cache">true</property>
Session级别的缓存

Session缓存级别意味着只有当一个特定的Session存在时才可以实用缓存,它是默认开启的,可以通过session.enableFetchProfile(String名称)方法启用。

查询缓存

查询缓存可以避免每次查询都要解析查询语句,并生成PreparedStatement。查询缓存只在开启了查询缓存后才有效。在hibernate.cfg.xml配置文件中,如下所示

<property name="hibernate.cache.use_query_cache">true</property>
二级缓存

二级缓存在SessionFactory中,被所有Session共享。因此,它比一级缓存有更大的范围且可以缓存更多的数据。开启二级缓存可以减少数据库的访问,提高性能。

开启二级缓存

在hibernate.cfg.xml文件中配置二级缓存的参数:

<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</property>
EHCache缓存

EHCache是Hibernate缓存的一种实现方式,他是一个开源缓存库,支持缓存Java对象。EHCache默认支持Hibernate的缓存机制,可以使用EHCache作为SessionFactory中二级缓存的实现。

EHCache的配置,可以在hibernate.cfg.xml文件中进行,如下所示

<bean id=“cacheManager“ class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cacheManager-ref="ehcache"></bean>
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:configLocation="classpath:config/ehcache.xml"></bean>
使用二级缓存

Hibernate中二级缓存的实现是靠Cache接口的实现来完成的,cache类包括GeneralDataRegion和QueryRegion。

  • GeneralDataRegion:通用数据区域
  • QueryRegion:查询缓存区域

使用二级缓存,需要在实体类上添加注解:@Cacheable和@Cache。

@Cacheable表示开启二级缓存。

@Cache表示二级缓存名称。

结论

在Hibernate中使用缓存可以大幅提高应用程序的性能,减少对数据库的访问次数,提高应用程序的响应速度。Hibernate提供了两种缓存机制:一级缓存和二级缓存,其中一级缓存是与Session绑定的,而二级缓存是与SessionFactory对象绑定的全局缓存。二级缓存采用第三方缓存框架EHCache实现,通过@Cacheable和@Cache注解来开启和指定二级缓存。