Hibernate 缓存
Hibernate 缓存是指为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能的一种策略。并不是指计算机的内存或者 CPU 的一二级缓存。
ORM 框架访问数据库的效率直接影响应用程序的运行速度,提升和优化 ORM 框架的执行效率至关重要。而 Hibernate 的缓存是提升和优化 Hibernate 执行效率的关键。
Hibernate 缓存在提高检索效率的同时,也会增强服务器的消耗,可能会对程序的性能产生影响,所以要注意缓存的使用策略。
一级缓存
一级缓存又称为 Session 缓存、会话级缓存。
通过 Session 从数据库查询实体时会把实体存储在内存中,下一次查询同一实体时不再从数据库获取,而从内存中获取,这就是缓存。
一级缓存的生命周期和 Session 相同,当 Session 销毁时,缓存也失效。因此,一级缓存的数据可适用范围在当前会话之内。
一级缓存无法取消,可通过以下两个方法管理:
evict():用于将某个对象从 Session 的一级缓存中清除
clear():用于将一级缓存中的所有对象全部清除
比较 | query.list() | query.iterate() |
---|---|---|
返回对象 | 返回持久化实体类对象 List | 返回代理对象 Iterate |
查询策略 | 直接发送 SQL 语句到数据库查询 | 先发送 SQL 语句查询 id,然后从缓存中根据 id 查询实体,若命中则返回结果;未命中就根据 id 发送 SQL 语句到数据库查询 |
缓存 | 会缓存,但不使用缓存 | 会使用缓存 |
二级缓存
二级缓存又称为全局缓存、应用级缓存。二级缓存允许 session 共用。
二级缓存是可插拔式缓存,默认实现是 EHCache。也支持 OSCache、SwarmCache、JBoss Cache。
配置 EHCache 3.x 缓存
- 添加二级缓存依赖包 EHCache
<!-- EHCache -->
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.7.1</version>
</dependency>
<!-- JCache -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jcache</artifactId>
<version>5.4.3.Final</version>
</dependency>
- 添加二级缓存的属性配置文件 ehcache.xml
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true">
</defaultCache>
</ehcache>
- 在 Hibernate 配置文件中配置二级缓存
<!-- 开启二级缓存 -->
<property name="cache.use_second_level_cache">true</property>
<!-- 开启查询缓存 -->
<property name="cache.use_query_cache">true</property>
<!-- 配置二级缓存实现类 -->
<property name="hibernate.javax.cache.provider">org.ehcache.jsr107.EhcacheCachingProvider</property>
<property name="cache.region.factory_class">org.hibernate.cache.jcache.internal.JCacheRegionFactory</property>
- 在需要被缓存的表所对应的映射文件中添加 标签
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.chen.hibernate.model">
<class name="Employee" table="employee">
<cache usage="read-only"/>
<id name="id" column="id" type="java.lang.Integer">
<generator class="identity"/>
</id>
<property name="name" column="name" type="java.lang.String"/>
<property name="salary" column="salary" type="java.math.BigDecimal"/>
</class>
</hibernate-mapping>
标签
- usage:指定缓存策略
- transactional - 为主读数据使用这个策略
- read-write - 为主读数据再一次使用这个策略
- nonstrict-read-write - 不保证缓存和数据库之间的一致性
- read-only - 适合永不改变数据的并发策略
- region:指定二级缓存区域名
- incluede:指定是否缓存延迟加载的对象
- all - 缓存所有对象
- non-lazy - 不缓存延迟加载的对象
Hibernate 缓存比较
比较 | 一级缓存 | 二级缓存 |
---|---|---|
缓存范围 | 事务范围,每个事务都拥有单独一级缓存 | 应用范围,当前应用内所有事务共享 |
并发访问策略 | 无 | 必须提供适当的并发访问策略 |
数据过期策略 | 无 | 缓存对象的最大数目、最长时间、最长空闲时间等 |
缓存实现 | 自带 | 第三方提供,可插拔集成 |
物理介质 | 内存 | 内存和硬盘 |
启用方式 | 默认启用,不可关闭 | 默认不启用,选择性开启 |