(hibernate学习笔记系列来自于 “疯狂Java” Hibernate视频学习)
一级缓存
一级缓存生命周期很短,与session生命周期一致,所以一级缓存也叫session级缓存或事务级缓存。位于缓存中的对象处于持久化状态,它与表中的相关记录对应,session能够在某些时间点,按照缓存中持久化对象的属性来同步数据库中表的记录,这一过程称为清理缓存。
- 一级缓存实现原理。
session缓存是由它的实现类sessionImpl中定义的一些集合属性构成的,原理是保证有一个引用在关联着某个持久化对象。保持它的生命周期不会结束。
- session缓存的作用
- 减少数据库访问,从内存中取数据比数据库汇总要快的多
- 缓存中的数据库与数据库中的同步;缓存会把改变的sql语句合并,减少访问次数
- 缓存中的对象存在循环关联时,session会保证不出现访问对象图的死循环。
- 一级缓存的方法和管理
- 方法
- get方法
- load方法
- iterater方法
- 管理
- session.clear
清除session,释放这些对象占用的内存
- session.evict(object)
删除session缓存中的object对象
- session.contains(object)
判断对象是否存在于session缓存中
- flush
刷新session,让缓存中的数据立即同步到表
- session.clear
避免一次性大量的实体数据入库导致内存溢出,可以先flush(),再clear()
- 方法
- session清理缓存的时间点
通过setFlushMode()方法来设置清理缓存的时间点
- FlushMode.AUTO
transaction.commit(),session.flush()都将清理缓存,无需手动执行session.flush()
- FlushMode.COMMIT
session.flush(),transaction.commit()才执行清理缓存
- FlushMode.MANUAL
即便transaction.commit()也不清理缓存,只能通过session.flush来清理
- FlushMode.ALWAYS
transaction.commit(),session.flush()的时候都会刷新数据库
- FlushMode.AUTO
- Hibernate中对象的状态
- 临时状态
- 持久状态
- 离线状态
实例
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();
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-13 10:21:02