hibernate缓存_事务隔离级别理解
1.hibernate缓存分一级缓存.二级缓存.
?
? 一级缓存: session级别的缓存.???
?二级缓存:sessionFactory级别的缓存.??? 在进程范围或者是集群范围
?
缓存范围:
??a: 事务范围内的缓存.像一级缓存属于事务范围之内的缓存.缓存随着事务的结束而消失.
??b:进程范围内的缓存.缓存被进程内的所有事务共享.这些事务有可能并发访问同一个缓存.因此必须对缓存采用必要的事务隔离级别.这里的缓存的存储介质可以内存或者是硬盘.
? c:集群范围内的缓存.在集群环境中.缓存被一个机器或者多个机器的进程所共享.缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证数据的一致性.
?
?
一级缓存:
? A:当调用SESSION的SAVE.UPDATE,SAVEORUPDATE方法时,如果缓存中不存在相应的对象,那么就把该对象加入到一级缓存中去.
?B.当调用SESSION的LOAD,GET以及QUERY查询接口的LIST,ITERATOR方法时,如果缓存中存在相应的对象,就不需要从数据库中检索.当调用SESSION的CLOSE方法时,缓存被清空.
?
SESSION接口的方法:
?A:SAVE和PERSIST.
?? SAVE方法会立即执行INSERT语句,而PERSIST方法可能不会立即执行,
B:GET和LOAD.
? 它会先判断对象是否存在,如果存在就不到数据库中去查询,当数据库不存在与OID相对应的记录时,LOAD方法会抛出异常,而GET方法会返回NULL.GET方法立即执行SELECT语句.
?
?
清理缓存:
?
? 是指SESSION按照缓存中对象的属性变化来同步更新数据库.?? 也就是说SESSION在清理缓存时,会自动进行脏检查,如果发现SESSION缓存中的对象与数据库中相应的记录不一致时,就会同步数据库.
?
何时清理缓存呢?
? 1.当调用事务的COMMIT方法的时候,会先清理缓存,然后再提交事务.
? 2.当调用SESSION的FLUSH的时候,
? 3.当应用程序执行一些查询操作时,如果缓存中的对象的属性发生了变化,那么就会先清理缓存.使得缓存与数据库中的数据保持同步,保证查询的结果返回的正确数据.
?
当二级缓存进程范围内的多个事务并发访问数据库相同的数据时,可能会出现五类并发访问的问题,因此必须采用必要的事务隔离级别.同样两个并发的事务访问缓存的相同的数据的时候,也有可能出现并发的问题.因此也要为HIBERNATE的二级缓存设定适当的并发访问策略.每一种策略对应一种事务隔离级别.
?
?
二级缓存的策略是针对ID查询的策略.和对象的ID密切相关,对么对于条件查询就不怎么适用了.对于这种情况的存在,HIBERNATE采用了"查询缓存",在一定程度上缓解这个问题.
?
启动用查询缓存之后,第一次执行查询时,HIBERNATE会把查询结果放入到查询缓存中,以后再次执行该查询语句时,只需从缓存中获得查询结果,从而提高查询性能.???? 查询缓存依赖二级缓存.
?
查询缓存只会存放实体的ID