为什么要使用缓存?
客户端向数据库服务器发送同样的sql查询语句,如果每次都去访问数据库,会导致性能的降低,这是就用到了缓存。
mybatis提供了两级缓存策略。
Mybatis一级缓存:
在一个sqlSession开启和关闭之间,sqlSession对象内部(其实是Executor)会维护一个缓存的对象,当查询数据时候,先从缓存中寻找是否存在该条数据,存在就直接取出来,不存在,向数据库发送sql查询, 然后将查询后的数据存入缓存,和返回给程序。
利
有限的解决了性能降低的问题
弊
如果在第一次和第二次查询期间,有程序更改了要查讯的数据库的数据,就会引起读取的数据是错误的,也就是
脏读,其实是mybatis在sqlSession执行commit()方法后会清空这个缓存。第二次去查询,依然会从数据库中查询,也可以手动调用sqlSession的clearCache方法。
这样就有了Mybatis二级缓存
二级缓存
二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace,不同的sqlSession两次执行相同 namespace下的sql语句且向sql中传递参数也相同即最终执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二 次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。Mybatis默认没有开启二级缓存需要在setting全局参数中配置开启二级缓存。
mybatis自带的有二级缓存,我们一般在项目中实现Mybatis的二级缓存,虽然Mybatis自带二级缓存功能,但是如果实在集群环境下,使用自带的二级缓存只是针对单个的节点,会存在问题,所以我们采用分布式的二级缓存功能。一般的缓存NoSql数据库如redis,Mancache等,或者EhCache都可以实现,从而更好地服务 tomcat集群中ORM的查询。