求职复习系列5 hibernate缓存和mybatis缓存

hibernate 缓存

一级缓存:Hibernate默认的缓存机制,它属于Session级别的缓存机制,也就是说Session关闭,缓存数据消失。

二级缓存:属于SessionFactory级别的缓存,二级缓存是全局性的,应用中的所有Session都共享这个二级缓存。

二级缓存默认是关闭的,一旦开启,当我们需要查询数据时,会先在一级缓存查询,还是没有,再去二级缓存

一级缓存

Session的save()方法持久化对象时,程序并不会立刻将这个数据搞到数据库,而是将它放在了Session的一级缓存中,Session的get()、load()方法也是,当我们调用Session的flush()时,数据才会一并存到数据库

这里也涉及到hibernate的三种状态,

游离态,持久态,临时态

一级缓存中常用其他方法:

session.evit(Object obj) 将指定的持久化对象从一级缓存中清除,释放所占用的内存资源,该对象从持久化状态成为游离对象

session.clear() 将一级缓存中的所有持久化对象清除,释放其占用的内存资源。

session.contains(Object obj) 判断指定的对象是否存在于一级缓存中。

session.flush() 刷新一级缓存区的内容,使之与数据库数据保持同步。

二级缓存

 
<property>true/<property>

<property>
org.hibernate.cache.ehcache.EhCacheRegionFactory
/<property>

<property>ehcache.xml/<property>

\t\t<property>thread/<property>

注解 在实体类上

@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)

二级缓存的使用策略一般有这几种:read-only、nonstrict-read-write、read-write、transactional。注意:我们通常使用二级缓存都是将其配置成 read-only ,即我们应当在那些不需要进行修改的实体类上使用二级缓存,否则如果对缓存进行读写的话,性能会变差,这样设置缓存就失去了意义。

总结

什么样的数据适合存放到第二级缓存中?   

1) 很少被修改的数据   

2) 不是很重要的数据,允许出现偶尔并发的数据   

3) 不会被并发访问的数据   

4) 常量数据   

不适合存放到第二级缓存的数据?   

1) 经常被修改的数据   

2) 绝对不允许出现并发访问的数据,如财务数据,绝对不允许出现并发   

3) 与其他应用共享的数据。

整理来自:https://blog.csdn.net/vipmao/article/details/51517658

mybatis 缓存

一级缓存是SqlSession级别的缓存。默认开启, 在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。

 1、第一次发起查询,先去找缓存中是否有,如果没有,从数据库查询。将查询结果存储到一级缓存中。

  2、如果中间sqlSession去执行commit操作(执行插入、更新、删除),则会清空SqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。

  3、第二次发起查询,先去找缓存中是否含有,缓存中有,直接从缓存中获取用户信息。

二级缓存是基于 mapper文件的namespace的,也就是说多个sqlSession可以共享一个mapper中的二级缓存区域,并且如果两个mapper的namespace相同,即使是两个mapper,那么这两个mapper中执行sql查询到的数据也将存在相同的二级缓存区域中

二级缓存需要手动开启,另外mapper.xml中也要添加<catch>标签,如果默认不配置,就会使用默认配置,实体类也需要序列化


<settings>
<setting>
/<settings>


分享到:


相關文章: