(hibernate学习笔记系列来自于 “疯狂Java” Hibernate视频学习)
一级缓存生命周期很短,与session生命周期一致,所以一级缓存也叫session级缓存或事务级缓存。位于缓存中的对象处于持久化状态,它与表中的相关记录对应,session能够在某些时间点,按照缓存中持久化对象的属性来同步数据库中表的记录,这一过程称为清理缓存。
一级缓存实现原理。
session缓存是由它的实现类sessionImpl中定义的一些集合属性构成的,原理是保证有一个引用在关联着某个持久化对象。保持它的生命周期不会结束。
session缓存的作用
一级缓存的方法和管理
管理
session.clear
清除session,释放这些对象占用的内存
session.evict(object)
删除session缓存中的object对象
session.contains(object)
判断对象是否存在于session缓存中
flush
刷新session,让缓存中的数据立即同步到表
避免一次性大量的实体数据入库导致内存溢出,可以先flush(),再clear()
session清理缓存的时间点
通过setFlushMode()方法来设置清理缓存的时间点
1、缓存的使用
/*
*缓存的使用
*当我们通过session获得一个对象的时候,如果在本session没有关闭之前,再次获得之前获得过的数据,将直接从session中获取
*/
//1.Configuration
Configuration config = new Configuration().configure();
//2.SessionFactory
ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(config.getProperty()).buildServiceRegistry();
SessionFactory factory = config.buildSessionFactory(sr);
//3.Session
Session session = factory.openSession();
//4.transaction
Person p = (Person) session.get(Person.class,1);
System.out.println(p);
//下面的语句执行的时候将不会查询数据库
Person p2 = (Person) session.get(Person.class,1);
System.out.println(p);
//5.close
session.close();
System.out.println("----------关闭session--------------");
Session session2 = factory.openSession();
//不是同一个session,会重新发出查询
Person p3 = (Person) session2.get(Person.class,1);
System.out.println(p3);
session2.close();
2、管理缓存
/*
* contains()
* evict()
* clear()
*/
//1.Configuration
Configuration config = new Configuration().configure();
//2.SessionFactory
ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(config.getProperty()).buildServiceRegistry();
SessionFactory factory = config.buildSessionFactory(sr);
//3.Session
Session session = factory.openSession();
//4.transaction
Person p = (Person) session.get(Person.class,1);
System.out.println(p);
//判断session是否有缓存参数对应得对象
if(session。contains(p)){
System.out.println("true");
//将指定的对象从session缓存中删除
session.evict(p);
}
//下面的语句执行的时候将会查询数据库
Person p2 = (Person) session.get(Person.class,1);
System.out.println(p);
//5.close
session.close();
3、批量操作
/*
* clear()
*/
//1.Configuration
Configuration config = new Configuration().configure();
//2.SessionFactory
ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(config.getProperty()).buildServiceRegistry();
SessionFactory factory = config.buildSessionFactory(sr);
//3.Session
Session session = factory.openSession();
//4.transaction
Transaction tr = ssession.beginTransaction();
for( int i = 1 ; i <= 100; i ++){
Person p = new Person();
p.setName("admin_" + i);
p.setPassword(123+i);
p.setBirthday(new Date());
Serializable id = session.save(p);
System.out.println("id--------"+id);
//当save之后对象将不再使用,也就没有了在session中存在的必要,
//没有及时清理,会占用很多不必要的内存
//避免一次性大量的实体数据入库导致内存溢出,可以先flush(),再clear()
if( i % 10 == 0){
System.out.println("清空缓存");
session.flush();//刷新session,让缓存中的数据立即同步到表
session.close();//清除session中缓存德对象,释放这些对象占用的内存
}
}
tr.comit();
//tr.rollback();出现异常可以回滚
//5.close
session.close();
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/havedream_one/article/details/46710931