<property name="hibernate.cache.use_query_cache">true</property>
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);}