轻松解读Hibernate一级缓存
创始人
2024-06-08 03:50:36
0

在学习Hibernate中,我们都知道由于一级Hibernate缓存的生命周期跟Session的生命周期一样,所以也可以理解为一级Hibernate缓存是session缓存。

一、通过在做查询的时候,有几个查询方法支持一级Hibernate缓存,它们分别是:load(),get(),iterate(),其中要注意的是iterate方法只对实体对象查询才支持一级缓存,如果使用iterate来查询对象里面的相关属性,则查询的时候不支持一级缓存。

1、load()方法。

例子:

  1. Student s = (Student)session.load(Student.class, 1);  
  2.             System.out.println(s.getName());  
  3.             System.out.println("---------------------");  
  4.             s = (Student)session.load(Student.class, 1);  
  5.            System.out.println(s.getName()); 

只发出一条sql语句,虽然这里使用两次load方法,但是***次load方法对于id为1的记录进行加载,到第3行才发出一条sql语句及符合的数据,这样就把数据放在一级缓存里面,在第4行开始继续使用load就从一级缓存里面抽取。

2、get()方法。

例子:

  1. Student s = (Student)session.get(Student.class, 1);  
  2.             System.out.println(s.getName());  
  3.            System.out.println("---------------------");  
  4.             s = (Student)session.load(Student.class, 1);  
  5.             System.out.println(s.getName()); 

跟1中load一样,只发出一条sql语句。

3、iterate()方法查询实体对象

例子:

  1. Student student = (Student)session.createQuery("from Student s where s.id=1").iterate().next();  
  2.            System.out.println("student.name=" + student.getName());  
  3.               
  4.             //会发出查询id的sql,不会发出查询实体对象的sql,因为iterate使用缓存  
  5.            student = (Student)session.createQuery("from Student s where s.id=1").iterate().next();  
  6.            System.out.println("student.name=" + student.getName()); 

总共发出3条sql语句,1、2行发出两条语句,1条是查询实体对象的sql,另一条是查询实体对象的name属性,由于使用一级缓存,之前1、2行查询的实体存放在一级缓存里面,所以5、6行利用一级缓存里面的数据只发出一条查询id的sql。

4、iterate()方法查询实体对象属性(不支持一级缓存)

例子:

  1. String name = (String)session.createQuery("select s.name from Student s where s.id=1").iterate().next();  
  2.             System.out.println("student.name=" + name);  
  3.               
  4.             //iterate查询普通属性,一级缓存不会缓存,所以发出sql  
  5.             //一级缓存是缓存实体对象的  
  6.             name = (String)session.createQuery("select s.name from Student s where s.id=1").iterate().next();  
  7.             System.out.println("student.name=" + name); 

由于iterate()方法查询实体对象属性,一级缓存不会产生作用,所以发出两条sql语句。

二、一级缓存是存在的,所以要更加合理的管理好,提高程序的效率,通常都是通过clear(),evict()方法来清除缓存,当不需要使用一级缓存或者是更加高效率使用一级缓存。

如果在一次性更新或者加入数量量比较大的情况下,更加要管理好一级缓存。

例子:

  1. for(int i=0;i<10000;i++)  
  2.             {  
  3.                 Student s = new Student();  
  4.                 s.setName("s"+i);  
  5.                 session.save(s);  
  6.                 if(i%20==0)  
  7.                 {  
  8.                     session.flush();  
  9.                     session.clear();  
  10.                }  
  11.            } 

在数据量比较大的情况下管理一级缓存的做法,一般都是设定一定数量的记录给更新或者保存等操作之后,避免一次性大量的实体数据入库导致内存溢出,所以才去先是用第8行的flush和第9行的clear方法来实现比较好的缓存管理。

在数据量特别大的时候,可以使用jdbc来实现,因为hibernate不太适合于数据量特别大的场合使用,如果连jdbc都满足不了数据量的效率要求,只好利用相关的数据库机制来实现。

【编辑推荐】

  1. 简述Hibernate中加载并存储对象
  2. Hibernate传播性持久化攻略
  3. 深入了解Hibernate自动状态检测
  4. Hinerbate单端关联代理颇析
  5. 教你如何在Hibernate中实例化集合和代理

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...