• 【java框架】JPA(4) -- JPA二级缓存与JPQL


    1.   JPA二级缓存配置

    JPA中的二级缓存是在EntityManagerFactory中,但是默认EntityManagerFactory中的二级缓存是没有开启的,如果需要开启二级缓存需要做如下配置:

    注:在hibernate4.3.8中是默认开启的二级缓存,无需配置;

    步骤如下:

    ①    导入JPA二级缓存的jar包;

    Jar包目录:

    hibernate-release-4.3.8.Finalliboptionalehcache

    ehcache-core-2.4.3.jar

    hibernate-ehcache-4.3.8.Final.jar

    slf4j-api-1.6.1.jar

    ②    对应在persistence.xml中添加如下配置:

    <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
                 version="2.0">
        <!--持久化单元 name:和项目名称对应-->
        <persistence-unit name="cn.yif.jpa04" transaction-type="RESOURCE_LOCAL">
            <!-- ALL:所有的实体类都被缓存 -->
            <!-- NONE:所有的实体类都不被缓存. -->
            <!-- ENABLE_SELECTIVE:标识 @Cacheable(true) 注解的实体类将被缓存 -->
            <!-- DISABLE_SELECTIVE:缓存除标识 @Cacheable(false) 以外的所有实体类 -->
            <!-- UNSPECIFIED:默认值,JPA 产品默认值将被使用 -->
            <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
            <properties>
                <!-- 必须配置4个连接数据库属性:配置信息可以在project/etc/hibernate.properties中找到 -->
                <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
                <property name="hibernate.connection.url" value="jdbc:mysql:///jpa04_0523" />
                <property name="hibernate.connection.username" value="root" />
                <property name="hibernate.connection.password" value="admin" />
    
                <!-- 必须配置1个数据库方言属性 -->
                <!-- 实现跨数据库关键类 :查询MySQLDialect的getLimitString方法 -->
                <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
    
                <!-- 可选配置 -->
                <!-- 是否自动生成表 -->
                <property name="hibernate.hbm2ddl.auto" value="validate" />
                <!-- 是否显示sql -->
                <property name="hibernate.show_sql" value="true" />
                <!-- 格式化sql -->
                <!--<property name="hibernate.format_sql" value="true" />-->
    
                <!-- hibernate.cache.use_second_level_cache:是否开启二级缓存  -->
                <property name="hibernate.cache.use_second_level_cache" value="true"/>
                <!--
                    hibernate.cache.region.factory_class :二级缓存的方言(选择的哪个工厂)
                    org.hibernate.cache.internal.EhCacheRegionFactory:EhCache缓存
                    比较尴尬的是:文档上写错了 (org.hibernate.cache.ehcache.EhCacheRegionFactory)
                 -->
                <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>
                <!--
                    hibernate.cache.use_query_cache:是否开启查询缓存
                    注意:必需要开启二级缓存,查询缓存才能起作用
                -->
                <property name="hibernate.cache.use_query_cache" value="true"/>
            </properties>
        </persistence-unit>
    </persistence>

    ③    在对应的Entity类上加上注解:@Cacheable(true)

    @Cacheable(true)
    @Entity
    public class Employee {
        @Id
        @GeneratedValue
        private Long id;
    
        private String name;

    2.   JPA集合缓存配置

    集合上面加上:@Cache(usage = CacheConcurrencyStrategy.READ_WRITE),就可以缓存这个集合

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "department")
    @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    //注意:hibernate集合缓存一般不用,不需要配置,配置完之后性能更差
    //如果一定要配置集合缓存,集合中的对象也一定要能够放到缓存中
    private Set<Employee> employeeSet = new HashSet<Employee>();

    3.   JPA查询缓存配置

    JPA查询缓存比较简单,只需要加上query1.setHint(QueryHints.HINT_CACHEABLE, true)即可。
    Query query1 = entityManager.createQuery("select o from Employee o where o.id = ?");
    //把这个query1放到查询缓存中,也会到查询缓存中取
    query1.setHint(QueryHints.HINT_CACHEABLE, true);
    query1.setParameter(1, 1L);
  • 相关阅读:
    Argument 1 cannot be null
    灵性的笔尖勾勒幻想的国度,找寻梦想的脚步!用我的思想创建一个芬芳的世界!
    错误: Aggregate query has too many rows > 不需要用子查询
    之前玩GAE收藏夹里的链接
    ExtJs收缩按钮相应事件如何被捕捉?
    winxp注册表之开始菜单和任务栏
    C#代码规范 程序员必备的秘笈[转]
    c#中datagridview里checkbox的使用方法[转]
    Log4Net详细介绍[转]
    Ubuntu10.04窗口风格改为windows风格的方法
  • 原文地址:https://www.cnblogs.com/yif0118/p/12952010.html
Copyright © 2020-2023  润新知