hibernate缓存_事宜隔离级别理解

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