>>分享JPA、Hibernate、Mybatis对象持久化技术,对《精通JPA与Hibernate:Java对象持久化详解》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 23603 个阅读者 刷新本主题
 * 贴子主题:  hibernate 5的二级缓存案例讲解 回复文章 点赞(0)  收藏  
作者:sunshine    发表时间:2018-12-01 00:11:01     消息  查看  搜索  好友  邮件  复制  引用

大家好,今天来记录讲解一下磕磕绊绊的hibernate5 的二级缓存配置,一条路摸到黑
那么在这之前我们先了解一下hibernate的一级缓存和二级缓存分别是什么?
说句通俗的话就是 一级缓存的信息只能在同一个session间传递,而二级缓存是不同的session间可以访问的,可以跨越Session存在,可以被多个Session所共享。需要第三方缓存框架的加持

那么什么数据适合放到二级缓存中呢?

便是那些不经常改动又经常被访问的数据,比如省市信息等,前台页面经常查询而没必要每次都要去数据库查询!

那么有什么三方框架可以支持hibernate的二级缓存呢?

EHCache: 可作为进程范围内的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持
OpenSymphony:可作为进程范围内的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持
SwarmCache:可作为集群范围内的缓存,但不支持Hibernate的查询缓存
JBossCache:可作为集群范围内的缓存,支持Hibernate的查询缓存

好,那么我们接下来就以EHCache来介绍一下hibernate二级缓存的用法

第一步:导入jar包(jar包附件给出)

ehcache-core-2.4.3.jar  
hibernate-ehcache-5.0.7.Final.jar  
commons-logging-1.1.1.jar  

第二步:声明缓存(在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>  
<!--但是在 hibernate 4中设置缓存提供商时是这样设置的  
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>-->  
<property name="hibernate.cache.use_query_cache">true</property>  

第三步:需要设置EHCache配置文件

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"  
>  
<diskStore path="C:/ehcache"/><!-- 需要在你的磁盘里面添加该目录 -->  
         <defaultCache      
            maxElementsInMemory="10000"  
            eternal="false"    
            timeToIdleSeconds="120"  
            timeToLiveSeconds="120"  
            overflowToDisk="true"  
            maxElementsOnDisk="10000000"  
            diskExpiryThreadIntervalSeconds="120"    
            memoryStoreEvictionPolicy="LRU"    
            />    
</ehcache>  

第四步:指定什么对象也就是model可以加入缓存

有两种配置方式,可以在hbm中创建安,也可以在cfg文件中创建
我们这里就以cfg文件配置为例

<class-cache usage="read-write" class="cn.patronli.domain.Order"/> <!-缓存的是对象-&#61664;  
<collection-cache usage="read-write" collection="cn.patronli.domain.Customer.orders"/> <!-缓存的是集合-&#61664;  

  为了保险起见 我们需要给相对应的model  实现一个序列化接口 implements Serializable  


那么如何在hbm中设置呢?需要再class后紧跟缓存配置,如下所示

<class name="Customer" table="t_customer" catalog="hibernateTest" lazy="true">  
    <cache usage="read-write"/>  

以上配置二选一 !!!!

那么最后我们就可以来进行测试了

public static void main(String[] args) {    
            
        Session s1 = HibernateUtils.openSession();  
        s1.beginTransaction();    
        Customer c1 = (Customer) s1.get(Customer.class, 1); // 从数据库中加载数据    
        System.out.println(c1.getName());  
        s1.getTransaction().commit();    
        s1.close(); // 关闭session级别的一级缓存    
    
        Session s2 = HibernateUtils.openSession();  
        s2.beginTransaction();    
        Customer c2 = (Customer) s2.get(Customer.class, 1); // 因为有了二级缓存的存在,并不会去查询数据库可以debug  观察控制台打印  
        System.out.println(c2.getName());    
    }    

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-02-24 10:35:14 重新编辑]
  Java面向对象编程-->泛型
  JavaWeb开发-->Web运作原理(Ⅱ)
  JSP与Hibernate开发-->数据库事务的概念和声明
  Java网络编程-->安全网络通信
  精通Spring-->CSS过渡和动画
  Vue3开发-->Vue简介
  孙卫琴的《精通JPA与Hibernate》的读书笔记:JPA的配置文件
  孙卫琴的《精通JPA与Hibernate》的读书笔记:在程序中动态指定...
  孙卫琴的《精通JPA与Hibernate》的读书笔记: 用JPQL批量处理...
  JPA EntityManager详解
  JPA Criteria查询入门
  EntityTransaction 与UserTransaction的区别
  征求意见:正在写一本新书《精通JPA与Hibernate》
  盘点Hibernate的值类型映射技巧
  Hibernate的Enver用法指南
  深入理解乐观锁和悲观锁
  Hibernate的八种对象标识符生成策略
  JPQL与SQL的区别
  Hibernate 对象-关系映射: @注解与xml 配置方式比较
  JPA (Java Persistence API)2.2 的一些新特性
  在看孙老师的hibernate书。。。
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。