5.测试方法:
测试一:
public static void main(String[] args) { Session session = null; Transaction t = null; /** * 开启两个session中发出load查询 */ /* try { session = HibernateUtils.getSession(); t = session.beginTransaction(); Student student = (Student) session.load(Student.class, 1); System.out.println("student.name=" + student.getName()); t.commit(); } catch (Exception e) { e.printStackTrace(); t.rollback(); } finally { HibernateUtils.closeSession(session); } try { session = HibernateUtils.getSession(); t = session.beginTransaction(); // 不会发出查询语句,因为开启了二级缓存,session共享二级缓存 Student student = (Student) session.load(Student.class, 1); System.out.println("student.name=" + student.getName()); t.commit(); } catch (Exception e) { e.printStackTrace(); t.rollback(); } finally { HibernateUtils.closeSession(session); }*/ /** * 开启两个session中发出get查询 */ try { session = HibernateUtils.getSession(); System.out.println(session); t = session.beginTransaction(); Student student = (Student) session.get(Student.class, 1); session.clear(); System.out.println("student.name=" + student.getName()); t.commit(); } catch (Exception e) { e.printStackTrace(); t.rollback(); } finally { HibernateUtils.closeSession(session); } try { session = HibernateUtils.getSession(); t = session.beginTransaction(); // 不会发出查询语句,因为开启了二级缓存,get使用二级缓存 Student student = (Student) session.get(Student.class, 1); System.out.println("student.name=" + student.getName()); t.commit(); } catch (Exception e) { e.printStackTrace(); t.rollback(); } finally { HibernateUtils.closeSession(session); } } } |
测试二:
public static void main(String[] args) { Session session = null; Transaction t = null; /** * 开启两个session中发出load查询,使用SessionFactory清除二级缓存 */ /* try { session = HibernateUtils.getSession(); t = session.beginTransaction(); //load时,会把对象放到两个缓存中 Student student = (Student) session.load(Student.class, 1); System.out.println("student.name=" + student.getName()); t.commit(); } catch (Exception e) { e.printStackTrace(); t.rollback(); } finally { HibernateUtils.closeSession(session); } //用SessionFacotry管理二级缓存 SessionFactory factory=HibernateUtils.getSessionFactory(); //evict()把id为1的Student对象从二级缓存中清除. factory.evict(Student.class, 1); try { session = HibernateUtils.getSession(); t = session.beginTransaction(); // 不会发出查询语句,因为开启了二级缓存,load也使用二级缓存 Student student = (Student) session.load(Student.class, 1); System.out.println("student.name=" + student.getName()); t.commit(); } catch (Exception e) { e.printStackTrace(); t.rollback(); } finally { HibernateUtils.closeSession(session); }*/ /** * 开启两个session中发出load查询,session对二级缓存的使用. */ try { session = HibernateUtils.getSession(); t = session.beginTransaction(); //设置一级缓存和二级缓存的交互模式: //GET表示在load时只是从二级缓存中读取数据,仅在数据更新时对二级缓存写数据。 //PUT表示只往二级缓存中放数据,而不从中取数据. //NORMAL表示从二级缓存中读、写数据。 //REFRESH表示仅向二级缓存写数据,但不从二级缓存中读数据。 session.setCacheMode(CacheMode.GET); Student student = (Student) session.load(Student.class, 1); System.out.println("student.name=" + student.getName()); t.commit(); } catch (Exception e) { e.printStackTrace(); t.rollback(); } finally { HibernateUtils.closeSession(session); } try { session = HibernateUtils.getSession(); t = session.beginTransaction(); // 会发出查询语句,因为前面设置了一级缓存和二级缓存的交互模式为GET,没有往二级缓存中放数据. Student student = (Student) session.load(Student.class, 1); System.out.println("student.name=" + student.getName()); t.commit(); } catch (Exception e) { e.printStackTrace(); t.rollback(); } finally { HibernateUtils.closeSession(session); } try { session = HibernateUtils.getSession(); t = session.beginTransaction(); //设置交互模式为PUT. session.setCacheMode(CacheMode.PUT); // 会发出查询语句,因为设置了一级缓存和二级缓存的交互模式为PUT,只是往二级缓存中放数据,并不去中取数据. Student student = (Student) session.load(Student.class, 1); System.out.println("student.name=" + student.getName()); t.commit(); } catch (Exception e) { e.printStackTrace(); t.rollback(); } finally { HibernateUtils.closeSession(session); } } } |