zoukankan      html  css  js  c++  java
  • hibernate二级缓存

    一.  hibernate 提供缓存机制:一级缓存、二级缓存

           一级缓存:session级别缓存,在一次请求中共享数据。

           二级缓存:sessionFactory级别缓存,整个应用程序共享一个会话工厂,共享一个二级缓存

    l  SessionFactory的缓存两部分:  

                   内置缓存:使用一个Map,用于存放配置信息,预定义HQL语句等,提供给Hibernate框架自己使用,对外只读的。不能操作。

                   外置缓存:使用另一个Map,用于存放用户自定义数据。默认不开启。外置缓存hibernate只提供规范(接口),需要第三方实现类。外置缓存有成为二级缓存。

          二级就是由4部分构成

             1.  类级别缓存

             2.  集合级别缓存

             3.  时间戳缓存

             4.  查询缓存(二级缓存的第2大部分,三级缓存)

        

       并发访问策略

       

       应用场景

       a.适合放入二级缓存中的数据:

           很少被修改

           不是很重要的数据, 允许出现偶尔的并发问题

      b.不适合放入二级缓存中的数据:

           经常被修改

           财务数据, 绝对不允许出现并发问题

           与其他应用数据共享的数据

    public void demo01(){
    //User user = new User();
    //user.setUsername("伟哥哥1");
    //user.setPassword("1234");
    //1.加载配置文件
    Configuration config=new Configuration().configure();
    //2.获取sessionFactory 相当于连接池
    SessionFactory sessionFactory = config.buildSessionFactory();
    //3.获取会话相当于连接 获取连接
    Session session = sessionFactory.openSession();
    //4.开启事务
    Transaction transaction = session.beginTransaction();
    User u = (User) session.get(User.class,"1");
    System.out.println(u);
    User u2 = (User) session.get(User.class,"1");
    System.out.println(u2);
    //提交事务
    transaction.commit();
    //释放资源
    session.close();
    //关闭工厂
    System.out.println("----------");
    Session s2 = sessionFactory.openSession();
    s2.beginTransaction();
    User u3=(User) s2.get(User.class, "1");
    //3 查询id=1 -- 从二级缓存获取
    System.out.println(u3);

    s2.getTransaction().commit();
    s2.close();

    sessionFactory.close();

    输出结果:没有二级缓存的输出结果

     配置二级缓存

    1.导入jar包:ehcache-1.5.0.jar/ commons-logging.jar/ backport-util-concurrent.jar

    2.开启二级缓存(我要使用二级缓存)

    3.确定二级缓存提供商(我要使用哪个二级缓存)

    4.确定需要缓存内容

           1>配置需要缓存的类

           2>配置需要缓存的集合

             结合暂不做演示

    5.配置ehcache自定义配置文件

     

    l  <diskStore path="java.io.tmpdir"/>  设置临时文件存放位置。(缓存一般内存,一定程度时,写入硬盘。)

          

    l  缓存详细设置

           <defaultCache> 所有的缓存对象默认的配置

           <cache name="类"> 指定对象单独配置

    l  参数设置

    maxElementsInMemory="10000"  内存最大数

    eternal="false"  是否永久(内存常驻留)

    timeToIdleSeconds="120"

    timeToLiveSeconds="120"

    overflowToDisk="true"  内存满了,是否写入到硬盘

    maxElementsOnDisk="10000000"  硬盘最大数

    diskPersistent="false"  关闭JVM,是否将内存保存硬盘中

    diskExpiryThreadIntervalSeconds="120"  轮询

    memoryStoreEvictionPolicy="LRU"

           Least Recently Used (specified as LRU).

           First In First Out (specified as FIFO)

           Less Frequently Used (specified as LFU)

    • maxElementsInMemory :设置基于内存的缓存中可存放的对象最大数目
    • eternal:设置对象是否为永久的,true表示永不过期,此时将忽略timeToIdleSeconds timeToLiveSeconds属性; 默认值是false
    • timeToIdleSeconds:设置对象空闲最长时间,以秒为单位, 超过这个时间,对象过期。当对象过期时,EHCache会把它从缓存中清除。如果此值为0,表示对象可以无限期地处于空闲状态。
    • timeToLiveSeconds:设置对象生存最长时间,超过这个时间,对象过期。
      如果此值为0,表示对象可以无限期地存在于缓存中. 该属性值必须大于或等于 timeToIdleSeconds 属性值
    • overflowToDisk:设置基于内在的缓存中的对象数目达到上限后,是否把溢出的对象写到基于硬盘的缓存中
    • diskPersistent 当jvm结束时是否持久化对象 true false 默认是false
    • diskExpiryThreadIntervalSeconds 指定专门用于清除过期对象的监听线程的轮询时间
    •  memoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出)

     配置二级缓存的输出结果:

         

  • 相关阅读:
    浅析Dagger2的使用
    Android消息机制源码分析
    EventBus3.0源码解析
    Android自定义控件(二)
    Android 自定义控件(一)
    Android IPC机制之ContentProvider
    Android IPC机制之Messenger
    Android IPC机制之AIDL
    Android网络请求框架
    Android常用设计模式(二)
  • 原文地址:https://www.cnblogs.com/fjkgrbk/p/hibernate_catch_2.html
Copyright © 2011-2022 走看看