关于ehcache二级缓存

hibernate默认开启一级缓存,其实和我们的mybatis的一级缓存一样的
默认保留级别是session级别。session关闭我们的保存的缓存消失,否则一直存在,想想我们之前修改的数据。
看这个实验
Student stu=(Student) session.get(Student.class, 4);
System.out.println(stu.getStuName());
stu.setStuName("xiaoming2");
Transaction tx=session.beginTransaction();
tx.commit();
Student stu2=(Student) session.get(Student.class, 4);
System.out.println(stu2.getStuName());

我们在这里需要使用2及缓存
ehcache-core-2.4.3.jar这个东西非常好用的。注意并不是属于hibernate的东西。也就是使用的别的地方的时候也可以使用

首先在src下创建ehcache.xml文件,注意这个文件我们可以在它的jar包中找到的
 <diskStore path="java.io.tmpdir"/>这句话表明了缓存默认会找到一个输出路径的 内存保存2级缓存
maxElementsInMemory可以存放对少个缓存对象。
eternal--是否是永久的不会被清除的
timeToIdleSeconds---多少秒清除
timeToLiveSeconds--存活多少秒 一般设置比上面要长一点时间。
overflowToDisk--如果超过了最多生存对象将被写入到硬盘上

首先我们看一级缓存

Student stu=(Student) session.get(Student.class, 4);
System.out.println(stu.getStuName());
Student stu2=(Student) session.get(Student.class, 4);
System.out.println(stu.getStuName());
发现sql语句执行了一次,在没关闭session之前,一级缓存是一直存在的。

我们做实验2
HibernateUtil util=new HibernateUtil();
Session session=util.getSession();
Student stu=(Student) session.get(Student.class, 4);
System.out.println(stu.getStuName());
session.close();//关闭session,在下边重新获得一个新的session
Session session2=util.getSession();
Student stu2=(Student) session2.get(Student.class, 4);
System.out.println(stu.getStuName());

我们现在就来配置
添加关于cache的jar包
首先在src下配置ehcache.xml文件,之前就说过了
第二在hibernate配置文件中添加如下话
<property name="cache.use_second_level_cache">true</property>
<property name="cache.use_query_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
第三在需要缓存的的配置文件中
 <cache usage="read-only" region="sampleCache1"/>

重新测试实验,实验成功
需要注意的是,我们不可以修改里边的数据了

这里需要注意的是,我们在ehcahe文件中看到的,二级缓存保存的是对象信息。那如果我们查询的东西并不是对象呢?
我们可以使用查询缓存。
查询缓存会把我们不是对象的数据包装成为对象使用
我们来看实验:
HibernateUtil util=new HibernateUtil();
Session session=util.getSession();
Query query=session.createQuery("select stuName from Student");
System.out.println(query.list().get(0));
session.close();
Session session2=util.getSession();
Query query2=session2.createQuery("select stuName from Student");
System.out.println(query2.list().get(0));

发现还是多次查询了数据库
怎么办?
其实我们刚才在配置文件添加的这个东西
<property name="cache.use_query_cache">true</property>
就是用于开启查询缓存
别的地方都不需要改变
HibernateUtil util=new HibernateUtil();
Session session=util.getSession();
Query query=session.createQuery("select stuName from Student");
query.setCacheable(true); //这里就是使用二级查询缓存
System.out.println(query.list().get(0));
session.close();
Session session2=util.getSession();
Query query2=session2.createQuery("select stuName from Student");
query2.setCacheable(true);
System.out.println(query2.list().get(0));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值