分享

hibernate的二级缓存 测试

 曾今最强 2011-04-01
hibernate二级缓存是由SessionFactory管理,所以又叫SessionFactory级缓存,它是通过不同的类库来实现的,比如ehcache、oscache等。和一级缓存一样,二级缓存也是用来缓存实体对象的,对普通属性不缓存。

 

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多