温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Hibernate一级缓存是什么

发布时间:2021-12-04 16:25:05 来源:亿速云 阅读:186 作者:iii 栏目:编程语言

本篇内容介绍了“Hibernate一级缓存是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

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

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

1、load()方法。

例子:

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

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

2、get()方法。

例子:

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

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

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

例子:

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

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

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

例子:

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

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

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

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

例子:

for(int i=0;i<10000;i++)              {                  Student s = new Student();                  s.setName("s"+i);                  session.save(s);                  if(i%20==0)                  {                      session.flush();                      session.clear();                 }             }

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

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

“Hibernate一级缓存是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI