Hibernate之查询缓存

true

try {/** * 此时会发出一条sql取出所有的学生信息 */session = HibernateUtil.openSession();Listls = session.createQuery("from Student").setCacheable(true)//开启查询缓存,查询缓存也是SessionFactory级别的缓存.setFirstResult(0).setMaxResults(50).list();Iteratorstus = ls.iterator();

for(;stus.hasNext();) {

Student stu = stus.next();

System.out.println(stu.getName());

}

* 会发出SQL取完整的学生对象,占用内存相对较多

ls = session.createQuery("from Student")

.setCacheable(true)

.setFirstResult(0).setMaxResults(50).list();

stus = ls.iterator();

for(;stus.hasNext();) {

Student stu = stus.next();

System.out.println(stu.getName());}

} catch (Exception e) {

e.printStackTrace();

} finally {

HibernateUtil.close(session);}

只要HQL语句不一样,就不会开启查询缓存,查询缓存是是HQL语句,只有两个HQL语句完全一样(并且参数都要一致)才会使用查询缓存。

try {/** * 查询缓存缓存的不是对象而是id */session = HibernateUtil.openSession();Listls = session.createQuery("from Student where name like ?").setCacheable(true)//开启查询缓存,查询缓存也是SessionFactory级别的缓存.setParameter(0, "%王%").setFirstResult(0).setMaxResults(50).list();Iteratorstus = ls.iterator();for(;stus.hasNext();) {Student stu = stus.next();System.out.println(stu.getName());}} catch (Exception e) {e.printStackTrace();} finally {HibernateUtil.close(session);}session = null;try {/** * 查询缓存缓存的是id,此时由于在缓存中已经存在了这样的一组学生数据,但是仅仅只是缓存了 * id,所以此处会发出大量的sql语句根据id取对象,这也是发现N+1问题的第二个原因 * 所以如果使用查询缓存必须开启二级缓存 */session = HibernateUtil.openSession();Listls = session.createQuery("from Student where name like ?").setCacheable(true)//开启查询缓存,查询缓存也是SessionFactory级别的缓存.setParameter(0, "%王%").setFirstResult(0).setMaxResults(50).list();Iteratorstus = ls.iterator();

for(;stus.hasNext();) {

Student stu = stus.next();

System.out.println(stu.getName());}

} catch (Exception e) {

e.printStackTrace();

} finally {

HibernateUtil.close(session);}

你可能感兴趣的:(Hibernate之查询缓存)