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>
閱讀更多 編程的boy 的文章