Hibernate 框架总结(六):缓存机制

Hibernate 框架总结(一):简单开发

Hibernate 框架总结(二):session的获取方式及hibernate对象的生命周期

Hibernate 框架总结(三):主键的生成策略

Hibernate 框架总结(四):多张表的关联映射

Hibernate 框架总结(五):查询

我理解的缓存通俗来说就是程序与硬盘数据交互的一块地方,属于内存的一部分,使用缓存可以大大加快程序与数据库的交互。

一级缓存:

一级缓存是session级别的缓存,它属于事务范围的缓存,一旦session关闭,一级缓存也就清除

//从util中拿到session
		Session session = HibernateUtils.getSession();
		//获取Student表中的数据
		Student s = (Student) session.get(Student.class, 2);
		System.out.println("执行sql");
		Student s1 = (Student) session.load(Student.class, 2);
		System.out.println("访问session缓存,不执行sql");
		System.out.println(s.getStuName());
		System.out.println(s1.getStuName());
		//关闭资源
		HibernateUtils.closeSession(session);

Hibernate 框架总结(六):缓存机制_第1张图片

在执行Get,Load,Save,Saveorupdate方法的时候,会在session中存储数据。当再次调用这些方法查询数据的时候,会先在session中查找是否有这些数据,如果有直接返回,如果没有,则发出sql查找

二级缓存:

进程级别的缓存,跨session适合经常用于查询并且很少更改的数据

hibernate的二级缓存依赖于第三方框架,这里使用ecache框架

,导入jar包

首先在hibernate.cfg.xml配置第三方框架



org.hibernate.cache.ehcache.EhCacheRegionFactory

"hibernate.cache.use_second_level_cache">true

需要在实体类上打一个注解,读写权限

@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)

给Student类打上注解,因为它关联classes类,给classes也打上缓存注解

//从util中拿到session
		Session session = HibernateUtils.getSession();
		//获取Student表中的数据
		Student s = (Student) session.get(Student.class, 2);
		System.out.println("执行sql,放入二级缓存");
		System.out.println(s.getStuName());
		//关闭资源
		HibernateUtils.closeSession(session);
		
		//再次开启session
		Session session1 = HibernateUtils.getSession();
		//获取Student表中的数据
		Student s1 = (Student) session1.get(Student.class, 2);
		System.out.println("不执行sql,进入二级缓存查询数据");
		System.out.println(s1.getStuName());
		//关闭资源
		HibernateUtils.closeSession(session1);

Hibernate 框架总结(六):缓存机制_第2张图片

查询缓存

属于二级缓存,将查询语句的数据存放到缓存当中

首先在hibernate.cfg.xml开启查询缓存,

true

//从util中拿到session
		Session session = HibernateUtils.getSession();
		//获取Student表中的数据
		Query q = session.createQuery("from Student");
		//将查询放入到缓存当中
		q.setCacheable(true);
		List list = q.list();
		
		
		System.out.println("执行sql,放入查询缓存");
		for (Student student : list) {
			student.getStuName();
		}
		//关闭资源
		HibernateUtils.closeSession(session);
		
		//再次开启session
		Session session1 = HibernateUtils.getSession();
		//获取Student表中的数据
		Query q1 = session1.createQuery("from Student");
		//将查询放入到缓存当中
		q1.setCacheable(true);	
		List list1 = q1.list();		
		
		System.out.println("不执行sql,查询缓存中已存在该查询语句");
		for (Student student : list1) {
			student.getStuName();
		}
		//关闭资源
		HibernateUtils.closeSession(session1);

你可能感兴趣的:(Hibernate框架)