Hibernate之查詢緩存

<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);}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容