Hibernate中不为人知的细节
hibernate的缓存
研究缓存:
1、一个持久化对象是在什么时候放进缓存中的
当执行session.get,load,save,update方法
2、在什么时候可以把缓存中的数据提取出来
如果缓存中有数据,则从缓存中拿出数据
3、缓存中的数据和数据库中的数据同步的问题
oscache ehcache josscache
--1、session.save或者session.update本身就是同步数据的过程
--2、可以利用session.flush做到数据的同步
注意点:
1、一级缓存又叫session缓存
2、一级缓存的生命周期和session的声明周期紧密相连的
sessionFactory.openSession -->一级缓存就开始起作用了
session.close-->session缓存中的数据全部清空了
通过session.get方法把一个持久化对象放入到一级缓存中,即放入到session缓存中
session.load
session.save
session.update
createQuery产生的数据是不会放到一级缓存中的,即session缓存
当执行session.get(Classes.class,1);的时候,把id 为1的classes对象放入到session的缓存中
当执行session.close时,意味着session的生命周期结束了
当缓存中有数据,则先从缓存中提取数据,如果缓存中没有数据,则向数据库要数据
如何清空session中的缓存数据?
测试session.evict--清空某一个对象的缓存
测试session.clear--清空所有缓存
当这个数据是共享的情况下,加载这个数据,最好先evict清空缓存,这样得到的结果肯定是与数据库同步的
session.flush
作用:
1、检测session缓存中的数据,如果发现持久化对象和数据库不同步,会发出SQL语句,保持对象和数据库的同步状态
2、在同步数据的过程中,并不情空缓存
说明:没有显示调用session.flush方法,则session.save或者session.update方法:
1、把参数的持久化对象同步到数据库中
2、把session缓存中的数据同步到数据库中
3、把参数的持久化对象放入到session的幻存中