Hiberante(9) 一级缓存(session级别)
Hiberante(九) 一级缓存(session级别)
一级缓存:
@Test public void test01(){ Session session =null; try { session = HibernateUtil.openSession(); //此时会发出一条sql语句 List<Student> stu=session.createQuery("from Student").setFetchSize(0).setMaxResults(50).list(); for(Student s:stu){ System.out.println(s.getName()); } } catch (Exception e) { e.printStackTrace(); }finally{ if(session!=null) session.close(); } } @Test public void test02(){ Session session =null; try { session = HibernateUtil.openSession(); //如果使用iterator方法返回列表,对于hibernate而言,它仅仅只是发出一条sql语句去除id列表 //在查询响应的具体的某个学生信息时,会发出相应的sql去取学生信息 // 这就是典型的N+1问题 // 存在iterator方法的原因是,有可能会在一个session中查询两次数据,如果使用list每一次都会把所有的数据查询出来 // 而使用iterator方法仅仅智慧查询id,此时所有的对象已经存储在一级缓存中(session的缓存),之后调用的时候直接从缓存中获取 Iterator<Student> stu=session.createQuery("from Student").setFetchSize(0).setMaxResults(50).iterate(); while(stu.hasNext()){ System.out.println(stu.next().getName()); } } catch (Exception e) { e.printStackTrace(); }finally{ if(session!=null) session.close(); } } @Test public void test03(){ Session session =null; try { session = HibernateUtil.openSession(); List<Student> stu=session.createQuery("from Student").setFetchSize(0).setMaxResults(50).list(); for(Student s:stu){ System.out.println(s.getName()); } /** * id=1的student对象已经在session的缓存中(一级缓存)中,此时就不会发出sql语句去取 */ Student s=(Student)session.load(Student.class, 1); System.out.println(s.getName()); } catch (Exception e) { e.printStackTrace(); }finally{ if(session!=null) session.close(); } }