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(先进先出)

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

     

原文地址:https://www.cnblogs.com/fjkgrbk/p/hibernate_catch_2.html