hibernate 一级缓存:(缓存的是实体对象)
一级缓存很短和session的生命周期一致,一级缓存也叫session级的缓存或事务缓存
哪些方法支持一级缓存:
*get()
*load()
*iterate() (查询实体对象)
如何管理一级缓存:
* session.clear() session.evict()
如何避免一次性大量的实体数据入库导致内存溢出
*先flush,再clear
如果数据量特别大,考虑采用jdbc实现,如果jdbc也不能满足要求,可以考虑采用数据库本身的特定导入工具
一.Load测试:在同一个session中发出两次load查询
Student sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
在同一个session中发出两次load查询,第一次load的时候不会去查询数据库,因为他是LAZY的,当使用的时候才去查询数据库,第二次load的时候也不会,当使用的时候也不会查询数据库,因为他在缓存里找到,不会发出sql
Load测试:开启两个session中发出两次load查询
Student sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
sessioin.close();
………..
sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
开启两个session中发出两次load查询,第一次load的时候不会去查询数据库,因为他是LAZY的,当使用的时候才去查询数据库,第二次load的时候也不会,当使用的时候查询数据库,因为session间不能共享一级缓存的数据,因为他会随session的生命周期存在和消亡
二.Get测试:在同一个session中发出两次get查询
Student sutdent =(Student)session.get(Student.class,1);
System.out.println(student.getName());
sutdent = (Student)session.get(Student.class,1);
System.out.println(student.getName());
在同一个session中发出两次get查询,第一次get的时候去查询数据库,第二次get的时候不会查询数据库,因为他在缓存里找到,不会发出sql
三.iterate测试:在同一个session中发出两次iterator查询
Student student = (Student)session.createQuery(“from Student swhere s.id=1”).iterate().next();
System.out.println(student.getName());
student = (Student)session.createQuery(“from Student s wheres.id=1”).iterate().next();
System.out.println(student.getName());
在同一个session中发出两次iterator查询,第一次iterate().next()的时候会发出查询id的sql,使用的时候会发出相应的查询实体对象,第二次iterate().next()的时候会发出查询id的sql,不会发出查询实体对象的sql,因为iterate使用缓存,不会发出sql
四.Iterate查询属性测试:同一个session中发出两次查询属性
String name = (String)session.createQuery(“select s.name fromStudent s where s.id=1”).iterate().next();
System.out.println(name);
String name = (String)session.createQuery(“select s.name fromStudent s where s.id=1”).iterate().next();
System.out.println(name);
在同一个session中发出两次查询属性,第一次iterate().next()的时候会发出查询属性的sql,第二次iterate().next()的时候会发出查询属性的sql,iterate查询普通属性,一级缓存不会缓存,所以会发出sql
五.同一个session中先save,再发出load查询save过的数据
Student stu = new Student();
stu.setName(“王五”);
Serializableid = session.save(stu);
Student sutdent = (Student)session.load(Student.class,id);
System.out.println(student.getName());
save的时候,他会在缓存里放一份,不会发出sql,因为save是使用缓存的
六.同一个session中先调用load查询,然后执行sessio.clear()或session.evict(),再调用load查询
Student sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
session.clear();
Student sutdent = (Student)session.load(Student.class,1);
System.out.println(student.getName());
sessio.clear()或session.evict()可以管理一级缓存,一级缓存无法取消,但可以管理.
上面的语句都会发出sql 因为一级缓存中的实体被清除了
七.向数据库中批量加入1000条数据
for(int i=0;i<1000;i++){
Student student = new Student();
student.setName(“s” + i);
session.save(student);
//每20条数据就强制session将数据持久化,同时清除缓存,避免大量数据造成内存溢出
if( i %20 == 0 ){
session.flush();
session.clear();
分享到:
相关推荐
hibernate一级缓存和二级缓存的区别与联系
Hibernate一级缓存、二级缓存以及查询缓存实例
NULL 博文链接:https://jiaguwen123.iteye.com/blog/740606
Hibernate 一级缓存和二级缓存的区别
NULL 博文链接:https://cdxs2.iteye.com/blog/1936594
NULL 博文链接:https://12345678.iteye.com/blog/721910
hibernate的一级缓存和二级缓存,hibernate的一级缓存和二级缓存,hibernate的一级缓存和二级缓存,hibernate的一级缓存和二级缓存,hibernate的一级缓存和二级缓存
Hibernatehibernate一级缓存.pdf
Hibernate一级缓存和二级缓存【内附二级缓存数据存储结构】
用以介绍hibernate 框架的缓存机制
hibernate 一级缓存、 持久化对象状态和转换、 多表映射操作
NULL 博文链接:https://364232252.iteye.com/blog/2369161
主要介绍了java模拟hibernate一级缓存示例,需要的朋友可以参考下
Hibernat一级缓存(源码) 需要的自己下载参考!!!
主要讲解hibernate缓存的配置和和使用方法,以及一级缓存和二级缓存的定义和区别,和查询缓存的使用
今天小编就为大家分享一篇关于Hibernate一级缓存和二级缓存详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
NULL 博文链接:https://quicker.iteye.com/blog/660498
详细描述了,Hibernate中一级缓存和二组缓存的思想思路,以及使用方法,使用情况。
做一个hibernate 二级缓存的例子,其中都已经加了注释,一看就明白,数据库需要自己建
Hibernate二级缓存 在一个数据库系统中,如果缓存设置的合适,那么可以极大的提高系统的效率,Hibernate作为一个ORM工具 提供了缓存的机制,包括一级(Session级)缓存和二级(SessionFactory级)缓存。这里主要...