天天看点

Hibernate - session一级缓存

看下面例子,就很快明白了

连续查询两次

public void testLoad(){
			
		Session session =null;
		try{
			session = HibernateUtil.getSession();
			session.beginTransaction();

			Student s = (Student)session.load(Student.class, 1);
			System.out.println("1.student Name:"+s.getName());
			
			Student s1 = (Student)session.load(Student.class, 1);
			System.out.println("2.student Name:"+s1.getName());

			session.getTransaction().commit();
		}catch(Exception e){
			session.getTransaction().rollback();
			e.printStackTrace();
		}finally{
			HibernateUtil.closeSession(session); 
		}
	}
           
  • 代码分析
  • 只执行一次sql语句:第一次load查询后放于缓存,第二次load查询会先看下缓存有没有,如果有的话,从缓存中获取数据

先添加,再查询

public void testAdd2(){
		Student s1 =  new Student();
		s1.setName("Jack");
		s1.setScore(90);
		
		
		Session session =null;
		try{
			session = HibernateUtil.getSession();
			session.beginTransaction();
			session.save(s1);
			
			Student s2 = (Student)session.load(Student.class, 2);
			System.out.println("2.student Name:"+s2.getName());
			
			session.getTransaction().commit();
		}catch(Exception e){
			session.getTransaction().rollback();
			e.printStackTrace();
		}finally{
			HibernateUtil.closeSession(session); 
		}
	}
           
  • 代码分析:
  • 只执行一条添加sql语句:save的时候先往缓存session里放(此时没有id),然后再往数据库里插入数据,再把id放到session里。然后查询的时候先查看缓存里有没有id为2的数据,如果有就直接获取

先查询,然后关闭session,再查询:

public void testLoad2(){
		
		Session session =null;
		try{
			session = HibernateUtil.getSession();
			session.beginTransaction();

			Student s = (Student)session.load(Student.class, 1);
			System.out.println("1.student Name:"+s.getName());
			
			session.getTransaction().commit();
		}catch(Exception e){
			session.getTransaction().rollback();
			e.printStackTrace();
		}finally{
			HibernateUtil.closeSession(session); 
		}
		
		session =null;
		try{
			session = HibernateUtil.getSession();
			session.beginTransaction();

			Student s = (Student)session.load(Student.class, 1);
			System.out.println("1.student Name:"+s.getName());
			
			session.getTransaction().commit();
		}catch(Exception e){
			session.getTransaction().rollback();
			e.printStackTrace();
		}finally{
			HibernateUtil.closeSession(session); 
		}
	}
           
  • 代码分析:
  • 执行两条sql语句,session关闭后,缓存数据也没有了,需要再到数据库查询。这就是一级缓存

继续阅读