21. 查询缓存

来源:互联网 发布:three.pano.js 编辑:程序博客网 时间:2024/04/27 15:54

查询缓存的重要知识点:

 

查询缓存是针对普通属性结果集的缓存

对实体对象的结果集只缓存id

 

查询缓存的生命周期,当前关联的表发生修改,那么查询缓存生命周期结束

 

查询缓存的配置和使用:

       * hibernate.cfg.xml文件中启用查询缓存(默认是关闭的),如:

       <property name="hibernate.cache.use_query_cache">true</property>

       * 在程序中必须手动启用查询缓存,如:

       query.setCacheable(true);

 

测试用例:

package com.bjsxt.hibernate;

 

import java.io.Serializable;

import java.util.Iterator;

import java.util.List;

import org.hibernate.CacheMode;

import org.hibernate.Query;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import junit.framework.TestCase;

 

public class QueryCacheTest extends TestCase {

 

       /**

        * 开启查询缓存,关闭二级缓存

        *

        * 开启一个session,分别调用query.list

        */

       public void testCache1() {

              Session session = null;

              try {

                     session = HibernateUtils.getSession();

                     session.beginTransaction();

                    

                     Query query = session.createQuery("select s.name from Student s");

                     //启用查询查询缓存

                     query.setCacheable(true);

                    

                     List names = query.list();

                     for (Iterator iter=names.iterator();iter.hasNext(); ) {

                            String name = (String)iter.next();

                            System.out.println(name);

                     }

                    

                     System.out.println("-------------------------------------");

                     query = session.createQuery("select s.name from Student s");

                     //启用查询查询缓存

                     query.setCacheable(true);

                    

                     //没有发出查询sql,因为启用了查询缓存

                     names = query.list();

                     for (Iterator iter=names.iterator();iter.hasNext(); ) {

                            String name = (String)iter.next();

                            System.out.println(name);

                     }

 

                     session.getTransaction().commit();

              }catch(Exception e) {

                     e.printStackTrace();

                     session.getTransaction().rollback();

              }finally {

                     HibernateUtils.closeSession(session);

              }

       }    

      

       /**

        * 开启查询缓存,关闭二级缓存

        *

        * 开启两个session,分别调用query.list

        */

       public void testCache2() {

              Session session = null;

              try {

                     session = HibernateUtils.getSession();

                     session.beginTransaction();

                    

                     Query query = session.createQuery("select s.name from Student s");

                     //启用查询查询缓存

                     query.setCacheable(true);

                    

                     List names = query.list();

                     for (Iterator iter=names.iterator();iter.hasNext(); ) {

                            String name = (String)iter.next();

                            System.out.println(name);

                     }

                     session.getTransaction().commit();

              }catch(Exception e) {

                     e.printStackTrace();

                     session.getTransaction().rollback();

              }finally {

                     HibernateUtils.closeSession(session);

              }

             

              System.out.println("-------------------------------------");

             

              try {

                     session = HibernateUtils.getSession();

                     session.beginTransaction();

                    

                     Query query = session.createQuery("select s.name from Student s");

                       //启用查询查询缓存

                            query.setCacheable(true);

                    

                     //不会发出查询sql,因为查询缓存的生命周期和session无关

                     List names = query.list();

                     for (Iterator iter=names.iterator();iter.hasNext(); ) {

                            String name = (String)iter.next();

                            System.out.println(name);

                     }

                     session.getTransaction().commit();

              }catch(Exception e) {

                     e.printStackTrace();

                     session.getTransaction().rollback();

              }finally {

                     HibernateUtils.closeSession(session);

              }

       }           

      

       /**

        * 开启查询缓存,关闭二级缓存

        *

        * 开启两个session,分别调用query.iterate

        */

       public void testCache3() {

              Session session = null;

              try {

                     session = HibernateUtils.getSession();

                     session.beginTransaction();

                    

                     Query query = session.createQuery("select s.name from Student s");

                     //启用查询查询缓存

                     query.setCacheable(true);

                      

                     for (Iterator iter=query.iterate();iter.hasNext(); ) {

                            String name = (String)iter.next();

                            System.out.println(name);

                     }

                     session.getTransaction().commit();

              }catch(Exception e) {

                     e.printStackTrace();

                     session.getTransaction().rollback();

              }finally {

                     HibernateUtils.closeSession(session);

              }

             

              System.out.println("-------------------------------------");

             

              try {

                     session = HibernateUtils.getSession();

                     session.beginTransaction();

                    

                     Query query = session.createQuery("select s.name from Student s");

                     //启用查询查询缓存

                     query.setCacheable(true);

                      

                     //查询缓存只对query.list()起作用,query.iterate不起作用,也就是query.iterate不使用查询缓存

                     for (Iterator iter=query.iterate();iter.hasNext(); ) {

                            String name = (String)iter.next();

                            System.out.println(name);

                     }

                     session.getTransaction().commit();

              }catch(Exception e) {

                     e.printStackTrace();

                     session.getTransaction().rollback();

              }finally {

                     HibernateUtils.closeSession(session);

              }

       }

      

       /**

        * 关闭查询缓存,关闭二级缓存

        *

        * 开启两个session,分别调用query.list查询实体对象

        */

       public void testCache4() {

              Session session = null;

              try {

                     session = HibernateUtils.getSession();

                     session.beginTransaction();

                    

                     Query query = session.createQuery("select s from Student s");

                     //启用查询查询缓存

                     //query.setCacheable(true);

                    

                     List students = query.list();

                     for (Iterator iter=students.iterator();iter.hasNext(); ) {

                            Student student = (Student)iter.next();

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

                     }

                     session.getTransaction().commit();

              }catch(Exception e) {

                     e.printStackTrace();

                     session.getTransaction().rollback();

              }finally {

                     HibernateUtils.closeSession(session);

              }

             

              System.out.println("-------------------------------------");

             

              try {

                     session = HibernateUtils.getSession();

                     session.beginTransaction();

                    

                     Query query = session.createQuery("select s from Student s");

                            //会发出查询sql,因为list默认每次都会发出查询sql

                     List students = query.list();

                     for (Iterator iter=students.iterator();iter.hasNext(); ) {

                            Student student = (Student)iter.next();

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

                     }

                     session.getTransaction().commit();

              }catch(Exception e) {

                     e.printStackTrace();

                     session.getTransaction().rollback();

              }finally {

                     HibernateUtils.closeSession(session);

              }

       }           

 

       /**

        * 开启查询缓存,关闭二级缓存

        *

        * 开启两个session,分别调用query.list查询实体对象

        */

       public void testCache5() {

              Session session = null;

              try {

                     session = HibernateUtils.getSession();

                     session.beginTransaction();

                    

                     Query query = session.createQuery("select s from Student s");

                     //启用查询查询缓存

                     query.setCacheable(true);

                    

                     List students = query.list();

                     for (Iterator iter=students.iterator();iter.hasNext(); ) {

                            Student student = (Student)iter.next();

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

                     }

                     session.getTransaction().commit();

              }catch(Exception e) {

                     e.printStackTrace();

                     session.getTransaction().rollback();

              }finally {

                     HibernateUtils.closeSession(session);

              }

             

              System.out.println("-------------------------------------");

             

              try {

                     session = HibernateUtils.getSession();

                     session.beginTransaction();

                    

                     Query query = session.createQuery("select s from Student s");

                     //启用查询查询缓存

                     query.setCacheable(true);

                    

                            //会发出n条查询语句,因为开启了查询缓存,关闭了二级缓存,那么查询缓存会缓存实体对象的id

                            //所以hibernate会根据实体对象的id去查询相应的实体,如果缓存中不存在相应的实体那么将发出根据实体id查询的sql语句,否则不会发出sql使用缓存中的数据

                     List students = query.list();

                     for (Iterator iter=students.iterator();iter.hasNext(); ) {

                            Student student = (Student)iter.next();

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

                     }

                     session.getTransaction().commit();

              }catch(Exception e) {

                     e.printStackTrace();

                     session.getTransaction().rollback();

              }finally {

                     HibernateUtils.closeSession(session);

              }

       }    

      

       /**

        * 开启查询缓存,开启二级缓存

        *

        * 开启两个session,分别调用query.list查询实体对象

        */

       public void testCache6() {

              Session session = null;

              try {

                     session = HibernateUtils.getSession();

                     session.beginTransaction();

                    

                     Query query = session.createQuery("select s from Student s");

                     //启用查询查询缓存

                     query.setCacheable(true);

                    

                     List students = query.list();

                     for (Iterator iter=students.iterator();iter.hasNext(); ) {

                            Student student = (Student)iter.next();

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

                     }

                     session.getTransaction().commit();

              }catch(Exception e) {

                     e.printStackTrace();

                     session.getTransaction().rollback();

              }finally {

                     HibernateUtils.closeSession(session);

              }

             

              System.out.println("-------------------------------------");

             

              try {

                     session = HibernateUtils.getSession();

                     session.beginTransaction();

                    

                     Query query = session.createQuery("select s from Student s");

                     //启用查询查询缓存

                     query.setCacheable(true);

                    

                     //不会发出查询sql,因为开启了二级缓存和查询缓存,查询缓存缓存了实体对象的id列表

                            //hibernate会根据实体对象的id列表到二级缓存中取得相应的数据

                     List students = query.list();

                     for (Iterator iter=students.iterator();iter.hasNext(); ) {

                            Student student = (Student)iter.next();

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

                     }

                     session.getTransaction().commit();

              }catch(Exception e) {

                     e.printStackTrace();

                     session.getTransaction().rollback();

              }finally {

                     HibernateUtils.closeSession(session);

              }

       }           

}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 广州中医药大学第一附属医院 河南中医药大学第一附属医院 河南中医药大学附属医院 成都中医药大学附属医院 云南中医药大学教务管理系统 湖北中医药大学教务 中医药大学附属医院 湖北中医药大学教务在线 天津中医药大学第一附属医院 天津中医药大学研究生院 云南中医药大学教务系统 北京中医药大学东方学院 山东中医药大学附属医院 辽宁中医药大学附属医院 上海中医药大学研究生院 广西中医药大学第一附属医院 山东中医药大学研究生处 江西中医药大学科技学院 广州中医药大学研究生院 陕西中医药大学数字校园 湖南中医药大学附属医院 安徽中医药大学第一附属医院 山东中医药大学第二附属医院 中医药大学东方学院 陕西中医药大学附属医院 安徽中医药大学附属医院 湖南中医药大学第一附属医院 浙江中医药大学教务处 甘肃中医药大学教务网 河南中医药大学中文网 世界中医药学会联合会 安微中医药高等专科学校 中华医学会中医药学会 中医药现代化国际科技大会 东中医药高等专科学校 世界科学技术中医药现代化 中医丰胸贴 中医特色贴敷疗法与处方 老中医小玲慧静煜通 输卵管通而不畅中医疗法 中医通下载