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);
		}
	}
}

相关推荐