首页 > 代码库 > 二级缓存 对数据查询
二级缓存 对数据查询
二级缓存:存放公有数据
1、适用场合:
1、数据不能频繁更新
2、数据能公开,私密性不是很强
2、hibernate本身并没有提供二级缓存的解决方案
3、二级缓存的实现是依赖于第三方供应商完成的
ehcache
oscache
jbosscache
swamchache
4、二级缓存的操作
1、二级缓存存在sessionFactory中
2、生命周期:与sessionFactory保持一致
3、使用二级缓存的步骤
1、在hibernate.cfg.xml
<property name="cache.use_second_level_cache">true</property>
<property name="cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
2、让某一个对象进入到二级缓存中(以下选一种配置方式,推荐第二种)
* 在配置文件中
<class-cache usage="read-only" class="cn.itcast.hiberate.sh.domain.Classes"/>
* 在映射文件中
<cache usage="read-only"/>
3、使用
session.get/session.load
5、查询缓存
在二级缓存的基础上 在cfg.xml加上
<property name="cache.use_query_cache">true</property>,只能在session.createQuery()中使用
示例:
hibernate.cfg.xml
1 <?xml version=‘1.0‘ encoding=‘utf-8‘?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <!-- 7 一个session-factory只能连接一个数据库 8 --> 9 <session-factory>10 <!-- 11 数据库的用户名12 -->13 <property name="connection.username">root</property>14 <!-- 15 密码16 -->17 <property name="connection.password">root</property>18 <!-- 19 url20 -->21 <property name="connection.url">22 jdbc:mysql://localhost:3306/itcast_sh_hibernate23 </property>24 <!-- 25 作用:根据持久化类和映射文件生成表26 validate27 create-drop28 create29 update30 -->31 <property name="hbm2ddl.auto">update</property>32 <!-- 33 显示hibernate内部生成的sql语句34 -->35 <property name="show_sql">true</property>36 <property name="format_sql">true</property>37 <!-- 38 告诉hibernate,session由当前线程产生39 -->40 <property name="current_session_context_class">thread</property>41 42 <!-- 43 开启二级缓存44 -->45 <property name="cache.use_second_level_cache">true</property>46 47 <!-- 48 二级缓存的提供商 49 -->50 <property name="cache.provider_class">51 org.hibernate.cache.EhCacheProvider52 </property>
<!--查询缓存,用于createQuery代码-->
53 <property name="cache.use_query_cache">true</property>54 55 <mapping resource="cn/itcast/hiberate/sh/domain/Classes.hbm.xml" />56 57 <!-- 58 <class-cache usage="read-only" class="cn.itcast.hiberate.sh.domain.Classes"/>59 -->60 </session-factory>61 </hibernate-configuration>
Classes.java
1 package cn.itcast.hiberate.sh.domain; 2 3 import java.io.Serializable; 4 import java.util.Set; 5 6 public class Classes implements Serializable{ 7 private Long cid; 8 private String cname; 9 private String description;10 11 public Long getCid() {12 return cid;13 }14 15 public void setCid(Long cid) {16 this.cid = cid;17 }18 19 public String getCname() {20 return cname;21 }22 23 public void setCname(String cname) {24 this.cname = cname;25 }26 27 public String getDescription() {28 return description;29 }30 31 public void setDescription(String description) {32 this.description = description;33 }34 35 public Set<Student> getStudents() {36 return students;37 }38 39 public void setStudents(Set<Student> students) {40 this.students = students;41 }42 43 private Set students;44 }
Classes.hbm.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 <hibernate-mapping> 5 <class name="cn.itcast.hiberate.sh.domain.Classes"> 6 <!-- 7 缓存策略 8 --> 9 <cache usage="read-write"/><!--对这个对象开启二级缓存 对于update测试用read-write 对查询的是read-only就可以了-->10 <id name="cid" length="5" type="java.lang.Long">11 <generator class="increment"></generator>12 </id>13 <property name="cname" length="20" type="java.lang.String"></property>14 15 <property name="description" length="100" type="java.lang.String"></property>16 <!-- 17 set元素对应类中的set集合18 通过set元素使classes表与student表建立关联19 key是通过外键的形式让两张表建立关联20 one-to-many是通过类的形式让两个类建立关联21 22 cascade 级联23 save-update24 1、当 保存班级的时候,对学生进行怎么样的操作25 如果学生对象在数据库中没有对应的值,这个时候会执行save操作26 如果学生对象在数据库中有对应的值,这个时候会执行update操作27 delete28 all29 inverse 维护关系30 true 不维护关系 31 false 维护关系32 default false33 -->34 <set name="students" cascade="save-update" inverse="true" fetch="select">35 <!-- 36 key是用来描述外键37 -->38 <key>39 <column name="cid"></column>40 </key>41 <one-to-many class="cn.itcast.hiberate.sh.domain.Student"/>42 </set>43 </class>44 </hibernate-mapping>
测试
1 package cn.itcast.hibernate.sh.test; 2 3 import java.util.List; 4 import java.util.Set; 5 6 import org.hibernate.Session; 7 import org.hibernate.Transaction; 8 import org.junit.Test; 9 10 import cn.itcast.hiberate.sh.domain.Classes;11 import cn.itcast.hiberate.sh.domain.Student;12 import cn.itcast.hibernate.sh.utils.HiberanteUtils;13 14 public class SecondCacheTest extends HiberanteUtils{15 static{16 url = "hibernate.cfg.xml";17 } 18 19 /**20 * session.get21 * 把数据存在一级缓存和二级缓存22 */23 @Test24 public void testGet(){25 Session session = sessionFactory.openSession();26 Classes classes = (Classes)session.get(Classes.class, 1L); //放入一级缓存 并且放入二级缓存27 session.close(); //关闭了一级缓存了28 session = sessionFactory.openSession();29 classes = (Classes)session.get(Classes.class, 1L); //这个时候不发出查询语句,因为从二级缓存中查询了30 session.close();31 }32 33 /**34 * session.load35 * 同上36 */37 @Test38 public void testLoad(){ //与get方法的情况是一样的39 Session session = sessionFactory.openSession();40 Classes classes = (Classes)session.load(Classes.class, 1L);41 classes.getCname();42 session.close();43 session = sessionFactory.openSession();44 classes = (Classes)session.load(Classes.class, 1L);45 classes.getCname();46 session.close();47 }48 49 /**50 * session.update51 */52 @Test53 public void testUpdate(){54 Session session = sessionFactory.openSession();55 //session.beginTransaction();56 Classes classes = new Classes();57 classes.setCid(1L);58 classes.setCname("aaa");59 session.update(classes);60 61 session.close();62 session = sessionFactory.openSession();63 classes = (Classes)session.get(Classes.class, 1L);64 session.close();65 } 66 }
查询缓存的测试
1 package cn.itcast.hibernate.sh.test; 2 3 import java.util.List; 4 import java.util.Set; 5 6 import org.hibernate.Query; 7 import org.hibernate.Session; 8 import org.hibernate.Transaction; 9 import org.junit.Test;10 11 import cn.itcast.hiberate.sh.domain.Classes;12 import cn.itcast.hiberate.sh.domain.Student;13 import cn.itcast.hibernate.sh.utils.HiberanteUtils;14 15 public class QueryCacheTest extends HiberanteUtils{16 static{17 url = "hibernate.cfg.xml";18 } 19 20 @Test21 public void testQuery(){22 Session session = sessionFactory.openSession();23 Query query = session.createQuery("from Classes");24 query.setCacheable(true);//classes里的所有的数据要往查询缓存中存放了 打开25 List<Classes> classesList = query.list();26 query = session.createQuery("from Classes"); 27 query.setCacheable(true); //打开查询缓存获取数据28 classesList = query.list();29 session.close();30 }31 }