一级缓存 和二级缓存

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"/>这句话表明了缓存默认会找到一个输出路径的
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));

posted on 2016-08-25 01:12  loongs  阅读(160)  评论(0编辑  收藏  举报

导航