JPA学习笔记 二级缓存

2018-03-26  本文已影响0人  殷俊杰
        User user=entityManager.find(User.class,5);
        User user2=entityManager.find(User.class,5);

输出

Hibernate: 
    select
        user0_.id as id1_6_0_,
        user0_.name as name2_6_0_ 
    from
        user user0_ 
    where
        user0_.id=?

很显然,只向数据库发起一次查询,这就是一级缓存的作用

        User user=entityManager.find(User.class,5);
        entityManager.close();
        entityManager=entityManagerFactory.createEntityManager();
        User user2=entityManager.find(User.class,5);

会查两次,EntityManager关闭了,缓存也就失效了

Hibernate: 
    select
        user0_.id as id1_6_0_,
        user0_.name as name2_6_0_ 
    from
        user user0_ 
    where
        user0_.id=?
Hibernate: 
    select
        user0_.id as id1_6_0_,
        user0_.name as name2_6_0_ 
    from
        user user0_ 
    where
        user0_.id=?

使用二级缓存
所谓的二级缓存,也就是可以跨entityManager的缓存,也就是说:就算你关闭了entityManager,缓存也依然在。

在配置文件persistence.xml中配置

<!-- 二级缓存相关 -->
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>
<property name="hibernate.cache.use_query_cache" value="true"/>

启用二级缓存:
缓存需要以下包


image.png

引入jar包时注意jar包版本

1.在实体类上加注解@Cacheable(true)

@Cacheable(true)
@Table(name="USER")
@Entity
public class User ...

在persistence.xml文件中配置二级缓存的策略

<!-- 
配置二级缓存的策略 
ALL:所有的实体类都被缓存
NONE:所有的实体类都不被缓存. 
ENABLE_SELECTIVE:标识 @Cacheable(true) 注解的实体类将被缓存
DISABLE_SELECTIVE:缓存除标识 @Cacheable(false) 以外的所有实体类
UNSPECIFIED:默认值,JPA 产品默认值将被使用
-->
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>

注意该配置要放在provider和class节点的后边
输出,只查了一次

Hibernate: 
    select
        user0_.id as id1_6_0_,
        user0_.name as name2_6_0_ 
    from
        user user0_ 
    where
        user0_.id=?
上一篇 下一篇

猜你喜欢

热点阅读