研究一级缓存需要理解的问题:
/**
* 1.一级缓存的生命周期
* 一级缓存在Session中存放,只要创建session,一级缓存就存在了。
* 当关闭Session的时候,一级缓存就不存在了。
* 2.一级缓存依赖于谁存在
* 依赖于session存在。
* 3.怎么样把数据存放到一级缓存中
* 利用session.get 、update、save方法
* 4.怎么样从一级缓存中获取数据
* 利用session.get方法
* 5.怎么样将一级缓存的数据同步到数据库
* 只要是一个持久化状态的数据,那它一定在一级缓存中
* 利用session.flush方法
* 6.怎么样将数据库中的数据同步到一级缓存
* session.refresh方法:只能同步一个对象
* 7.一级缓存的特性
* 也叫session级别的缓存。
* session中存放私有数据。
* 可以通过新建session和从当前线程中获取session来保证数据的安全性。
* 8.从一级缓存中清除某个对象
* session.evcit方法、并且将一个对象从持久化状态转换成脱管状态。
* 9.清空一级缓存中所以的数据
* session.clear方法
*/
session.save()方法
- 可以将一个对象变成持久化对象
- 将该对象保存在一级缓存中。
session.update()方法
- 能把一个对象转化为持久化状态
- 能把一个对象存放到一级缓存中。
session.flush()方法
- Hibernate内部会去检查session缓存中的所有对象
- 如果该对象是持久化对象,并且该对象的ID在数据库中有对应的记录,并且该对象的属性发生变化,则会自动发出update语句。如果对象属性没有发生变化,则不会发出update语句。
- 检查持久化对象中是否有关联的对象,如果有关联对象,并且设置了级联(cascade)操作,就会检查级联对象的id在数据库里有没有对应的记录,如果有则发出update语句,如果没有则发出insert语句
- 如果有维护关系的代码,则还会改变关系。
- 全部检查完成以后,就会发出sql语句,把一级缓存中的数据同步到数据库中。
session.refresh()方法
1.将一个对象对应的数据库数据重新更新到一级缓存中去
session.clear()方法
- 清空一级缓存中的所有数据
注意:存在一种情况,就是大量插入数据的时候,比如同时插入几十万行数据到Session的一级缓存中,就有可能会出现一个问题:缓存被占满了,提交数据的时候需要定时清空再提交。例子:
经过测试,当循环是10万的时候没问题,当循环变成100万的时候就会报错。
超出缓存了。
所以我们需要分段清理缓存。因为10万条能正常进行,所以我们就以10万条为一个单位,满了就先提交,再清除缓存,再加入10万条,再提交再清空,以此类推。所以如果是100万行数据的插入的代码如下: