美文网首页
JPA学习笔记 二级缓存

JPA学习笔记 二级缓存

作者: 殷俊杰 | 来源:发表于2018-03-26 15:49 被阅读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=?
    

    相关文章

      网友评论

          本文标题:JPA学习笔记 二级缓存

          本文链接:https://www.haomeiwen.com/subject/ywlrqftx.html