ssm框架-缓存浅谈
来源:互联网 发布:sql删除数据的语句 编辑:程序博客网 时间:2024/06/04 00:32
缓存的概念
java里缓存可以分两种情况,一种是JVM的缓存,这个是JVM与操作系统打交道用的,在使用java语言开发时,一般不用到。
一种是java语言缓存,这里的缓存是一种机制,不与任何硬件相关。比如一个 static的变量, 当第一次访问他时我们到文件里读他的值,以后访问时,直接把这个值返回去,这里省下了IO的时间,提高了效率,这就是一个简单的缓存机制。
一级缓存
一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构用于存储缓存数据。不同的sqlSession之间的缓存数据区域是互相不影响的。也就是他只能作用在同一个sqlSession中,不同的sqlSession中的缓存是互相不能读取的。
处理流程:
用户发起查询请求,查找某条数据,sqlSession先去缓存中查找,是否有该数据,如果有,读取;
如果没有,从数据库中查询,并将查询到的数据放入一级缓存区域,供下次查找使用。
但sqlSession执行commit,即增删改操作时会清空缓存。这么做的目的是避免脏读。
如果commit不清空缓存,会有以下场景:A查询了某商品库存为10件,并将10件库存的数据存入缓存中,之后被客户买走了10件,数据被delete了,但是下次查询这件商品时,并不从数据库中查询,而是从缓存中查询,就会出现错误。
二级缓存
二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。
UserMapper有一个二级缓存区域(按namespace分),其它mapper也有自己的二级缓存区域(按namespace分)。每一个namespace的mapper都有一个二级缓存区域,两个mapper的namespace如果相同,这两个mapper执行sql查询到数据将存在相同的二级缓存区域中。
处理流程:
这里有一个问题,既然有了一级缓存,那么为什么要提供二级缓存呢?
二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。二级缓存的作用范围更大。
还有一个原因,实际开发中,MyBatis通常和Spring进行整合开发。Spring将事务放到Service中管理,对于每一个service中的sqlsession是不同的,这是通过mybatis-spring中的org.mybatis.spring.mapper.MapperScannerConfigurer创建sqlsession自动注入到service中的。 每次查询之后都要进行关闭sqlSession,关闭之后数据被清空。所以spring整合之后,如果没有事务,一级缓存是没有意义的。
二级缓存的使用:
1,打开总开关
在MyBatis的配置文件中加入:
<settings>
<!--开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
2,在需要开启二级缓存的mapper.xml中加入caceh标签
<cache/>
3,让使用二级缓存的POJO类实现Serializable接口
public class User implements Serializable {}
整合ehcache
分布式缓存能够高性能地读取数据、能够动态地扩展缓存节点、能够自动发现和切换故障节点、能够自动均衡数据分区,而且能够为使用者提供图形化的管理界面,部署和维护都十分方便。
而mybatis无法实现分布式缓存,需要和其它分布式缓存框架进行整合。这里简单介绍和ehcache整合。
整合流程:
mybatis提供了一个cache接口,如果要实现自己的缓存逻辑,实现cache接口开发即可。
mybatis和ehcache整合,mybatis和ehcache整合包中提供了一个cache接口的实现类。
package org.apache.ibatis.cache.impl;import java.util.HashMap;import java.util.Map;import java.util.concurrent.locks.ReadWriteLock;import org.apache.ibatis.cache.Cache;import org.apache.ibatis.cache.CacheException;/** * @author Yien */public class PerpetualCache implements Cache { private String id; private Map<Object, Object> cache = new HashMap<Object, Object>(); public PerpetualCache(String id) { this.id = id; } public String getId() { return id; } public int getSize() { return cache.size(); } public void putObject(Object key, Object value) { cache.put(key, value); } public Object getObject(Object key) { return cache.get(key); } public Object removeObject(Object key) { return cache.remove(key); } public void clear() { cache.clear(); } public ReadWriteLock getReadWriteLock() { return null; } public boolean equals(Object o) { if (getId() == null) throw new CacheException("Cache instances require an ID."); if (this == o) return true; if (!(o instanceof Cache)) return false; Cache otherCache = (Cache) o; return getId().equals(otherCache.getId()); } public int hashCode() { if (getId() == null) throw new CacheException("Cache instances require an ID."); return getId().hashCode(); }}
配置步骤:
1,配置mapper中cache中的type为ehcache对cache接口的实现类型
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
表示开启此mapper的namespace下的二级缓存
type表示指定cache接口的实现类的类型,mybatis默认使用PerpetualCache。
要和ehcache整合,需要配置type为ehcache实现cache接口的类型。
2,加入ehcache的配置文件
在classpath下配置ehcache.xml
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <diskStore path="F:\develop\ehcache" /> <defaultCache maxElementsInMemory="1000" maxElementsOnDisk="10000000" eternal="false" overflowToDisk="false" timeToIdleSeconds="120" timeToLiveSeconds="120" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"> </defaultCache></ehcache>
3,Maven中ehcache 相关依赖
<dependency> <groupId>org.ehcache</groupId> <artifactId>ehcache</artifactId> <version>3.1.3</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-ehcache --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.0.0</version></dependency>
最后,简单比较三个比较流行的缓存工具。
ehcache 是一个纯Java的进程内缓存框架,hibernate使用其做二级缓存。同时,ehcache可以通过多播的方式实现集群。
memcache是一套分布式的高速缓存系统,提供key-value这样简单的数据储存,可充分利用CPU多核,无持久化功能。
redis高性能的key-value系统,提供丰富的数据类型,单核CPU有抗并发能力,有持久化和主从复制的功能。
- ssm框架-缓存浅谈
- 浅谈SSM框架
- SSM框架浅谈
- 浅谈对S2SH,SSM框架的理解
- 浅谈当时自学SSM框架的心得
- 浅谈框架之SSM的配置
- ssm 框架集成memcached 缓存服务器
- java 整合redis缓存 SSM 后台框架
- ssm框架学习---mybatis中缓存
- SSM框架下的redis缓存
- 浅谈持久层框架中的缓存机制
- redis缓存 SSM 后台框架 rest接口 下拉多级联动
- SSM框架
- SSM框架
- SSM框架
- SSM框架
- ssm框架
- ssm框架
- 将windows下的txt格式转化为linux下的文件格式
- Oracle数据库统计信息收集:dbms_stats包的使用说明书
- ECSHOP二次开发教程__连接
- QML之CheckBox与ComboBox
- 《C++ Primer》读书笔记第六章-3-特殊特性 And 函数匹配 And 函数指针
- ssm框架-缓存浅谈
- Android Matrix的代码验证和应用
- 又是一周的学习
- 八皇后问题
- 关于ssm整合的豆知识<一>
- git学习——简介&常用命令
- 15算法课程 1. Two Sum
- 欢迎使用CSDN-markdown编辑器
- Friend Numbers (20)