Hibernate学习之二级缓存
为什么需要二级缓存?
因为一级缓存有限(生命周期短),所以我们需要二级缓存(SessionFactory缓存)来弥补这个问题
需要配置
二级缓存是交给第三方去处理,常见的Hashtable,OSCache,EHCache
二级缓存的对象可能放在内存,也可能放在磁盘.
在*.hbm.xml文件中加入使用二级缓存的策略:
<cacheusage="read-write"/>
也可以直接在hibernate.cfg.xml配置:
<class-cacheclass="cn.cz.domain.Users"usage="read-only"/>
案例:
使用OsCache来演示二级缓存的使用.
配置二级缓存
对配置说明:
<propertyname="hbm2ddl.auto">update</property>
<!--启动二级缓存-->
<propertyname="cache.use_second_level_cache">true</property>
<!--指定使用哪种二级缓存-->
<propertyname="cache.provider_class">org.hibernate.cache.OSCacheProvider</property>
<mappingresource="com/cz/domain/Department.hbm.xml"/>
<mappingresource="com/cz/domain/Student.hbm.xml"/>
<!--指定哪个domain启用二级缓存
特别说明二级缓存策略:
hibernate二级缓存策略
只读缓存(read-only)
读写缓存(read-write)[银行,财务软件]
不严格读写缓存(nonstrict-read-write)[bbs被浏览多少次]
事务缓存(transactional)
-->
<class-cacheclass="com.hsp.domain.Student"usage="read-write"/>
将oscache.properties文件放在src目录下,这样你可以指定放入二级缓存的对象capacity大小.默认1000
如果报错还要再引入Hibernate的log4j.jar
使用:
//通过获取一个sesion,让hibernate框架运行(config->加载hibernate.cfg.xml)
Sessions=null;
Transactiontx=null;
try{
//使用基础模板
s=HibernateUtil.openSession();
tx=s.beginTransaction();
//查询45号学生
Studentstu1=(Student)s.get(Student.class,45);//45->一级缓存
System.out.println(stu1.getName());
tx.commit();
}catch(Exceptione){
e.printStackTrace();
if(tx!=null){
tx.rollback();
}
}finally{
if(s!=null&&s.isOpen()){
s.close();
}
}
System.out.println("*********************************");
try{
//使用基础模板
s=HibernateUtil.openSession();
tx=s.beginTransaction();
//查询45号学生
Studentstu1=(Student)s.get(Student.class,45);
System.out.println(stu1.getName());
Studentstu3=(Student)s.get(Student.class,46);
System.out.println(stu3.getName());
tx.commit();
}catch(Exceptione){
e.printStackTrace();
if(tx!=null){
tx.rollback();
}
}finally{
if(s!=null&&s.isOpen()){
s.close();
}
}
//完成一个统计,统计的信息在Sessfactory
//获取SessionFactory对象.
Statisticsstatistics=HibernateUtil.getSessionFactory().getStatistics();
System.out.println(statistics);
System.out.println("放入"+statistics.getSecondLevelCachePutCount());
System.out.println("命中"+statistics.getSecondLevelCacheHitCount());
System.out.println("错过"+statistics.getSecondLevelCacheMissCount());
在配置了二级缓存后,要注意可以通过Statistics,查看你的配置命中率高不高
HibernateUtil.java:
package com.sina.util; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; final public class HibernateUtil { private static SessionFactory sessionFactory=null; //使用线程局部模式 private static ThreadLocal<Session> threadLocal=new ThreadLocal<Session>(); private HibernateUtil(){}; static { sessionFactory=new Configuration().configure().buildSessionFactory(); } //获取SessionFactory public static SessionFactory getSessionFactory(){ return SessionFactory; } //获取全新的全新的sesession public static Session openSession(){ return sessionFactory.openSession(); } //获取和线程关联的session public static Session getCurrentSession(){ Session session=threadLocal.get(); //判断是否得到 if(session==null){ session=sessionFactory.openSession(); //把session对象设置到 threadLocal,相当于该session已经和线程绑定 threadLocal.set(session); } return session; } public static void closeCurrentSession(){ Session s=getCurrentSession(); if(s!=null&& s.isOpen() ){ s.close(); threadLocal.set(null); } } }