一级缓存

hibernate一级缓存
    
一级缓存很短和session的生命周期一致,一级缓存也叫session级的缓存或事务级缓存

那些方法支持一级缓存:
    * get()
    * load()
    * iterate(查询实体对象)

Iterator查询普通属性,一级缓存不会缓存,所以会发出SQL,一级缓存是缓存实体对象的  
 
如何管理一级缓存:
    * session.clear(),session.evict()
    
如何避免一次性大量的实体数据入库导致内存溢出
    * 先flush,再clear
    
如果数据量特别大,考虑采用jdbc实现,如果jdbc也不能满足要求可以考虑采用数据本身的特定导入工具

  1. ======================================================
  2. 在同一个session中发出两次load查询
  3.              Student student = (Student)session.load(Student.class1);
  4.             System.out.println("student.name=" + student.getName());
  5.            
  6.             //不会发出sql,因为load使用缓存
  7.             student = (Student)session.load(Student.class1);
  8.             System.out.println("student.name=" + student.getName());
  9. ============================================================
  10. 在同一个session中发出两次get查询
  11.             Student student = (Student)session.get(Student.class1);
  12.             System.out.println("student.name=" + student.getName());
  13.            
  14.             //不会发出sql,因为get使用缓存
  15.             student = (Student)session.get(Student.class1);
  16.             System.out.println("student.name=" + student.getName());
  17. ===============================================================
  18. 在同一个session中发出两次iterate查询实体对象
  19.             Student student = (Student)session.createQuery("from Student s where s.id=1").iterate().next();
  20.             System.out.println("student.name=" + student.getName());
  21.            
  22.             //会发出查询id的sql,不会发出查询实体对象的sql,因为iterate使用缓存
  23.             student = (Student)session.createQuery("from Student s where s.id=1").iterate().next();
  24.             System.out.println("student.name=" + student.getName());
  25. =================================================================
  26. 在同一个session中发出两次iterate查询实体对象
  27.      String name = (String)session.createQuery("select s.name from Student s where s.id=1").iterate().next();
  28.             System.out.println("student.name=" + name);
  29.            
  30.             //iterate查询普通属性,一级缓存不会缓存,所以发出sql
  31.             //一级缓存是缓存实体对象的
  32.             name = (String)session.createQuery("select s.name from Student s where s.id=1").iterate().next();
  33.             System.out.println("student.name=" + name);
  34. ===================================================================
  35. 开启两个session中发出load查询
  36. try {
  37.             session = HibernateUtils.getSession();
  38.             session.beginTransaction();
  39.            
  40.             Student student = (Student)session.load(Student.class1);
  41.             System.out.println("student.name=" + student.getName());
  42.             session.getTransaction().commit();
  43.         }catch(Exception e) {
  44.             e.printStackTrace();
  45.             session.getTransaction().rollback();
  46.         }finally {
  47.             HibernateUtils.closeSession(session);
  48.         }
  49.        
  50.         try {
  51.             session = HibernateUtils.getSession();
  52.             session.beginTransaction();
  53.            
  54.             //会发出查询语句,session间不能共享一级缓存的数据
  55.             //因为它会伴随session的生命周期存在和消亡
  56.             Student student = (Student)session.load(Student.class1);
  57.             System.out.println("student.name=" + student.getName());
  58.             session.getTransaction().commit();
  59. ==================================================================
  60. 在同一个session中先save,在发出load查询save过的数据
  61.             Student stu = new Student();
  62.             stu.setName("王五");
  63.            
  64.             Serializable id = session.save(stu);   //save有一个返回值,即是它的ID
  65.            
  66.             //不会发出sql,因为save是使用缓存的
  67.             Student student = (Student)session.load(Student.class, id);
  68.             System.out.println("student.name=" + student.getName());
  69. ============================================================
  70. 向数据库中批量加入1000条数据
  71.             for (int i=0; i<1000; i++) {
  72.                 Student student = new Student();
  73.                 student.setName("s_" + i);
  74.                 session.save(student);
  75.                 //每20条数据就强制session将数据持久化
  76.                 //同时清除缓存,避免大量数据造成内存溢出
  77.                 if ( i % 20 == 0) {
  78.                     session.flush();
  79.                     session.clear();
  80.                 }
  81.             }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值