缓存:
/**
* 两级缓存:
* 一级缓存:(本地缓存):sqlSession 级别的缓存. 一级缓存是一直开启的; SqlSession 级别的一个 Map
* 与数据库同一次会话期间查询到的数据会放在本地缓存中.
* 以后如果需要获取相同的数据, 直接从缓存中拿, 没必要再去查询数据库;
*
* 一级缓存失效情况 (没有使用到当前一级缓存的情况, 效果就是, 还需要再向数据库发出查询):
* 1,sqlSession 不同.
* 2,sqlSession 相同, 查询条件不同.(当前一级缓存中还没有这个数据)
* 3,sqlSession 相同, 两次查询之间执行了增删改操作 (这次增删改可能对当前数据有影响)
* 4,sqlSession 相同, 手动清除了一级缓存 (缓存清空)
*
* 二级缓存:(全局缓存): 基于 namespace 级别的缓存: 一个 namespace 对应一个二级缓存:
* 工作机制:
* 1, 一个会话, 查询一条数据, 这个数据就会被放在当前会话的一级缓存中;
* 2, 如果会话关闭; 一级缓存中的数据会被保存到二级缓存中; 新的会话查询信息, 就可以参照二级缓存中的内容;
* 3,sqlSession===EmployeeMapper==>Employee
* DepartmentMapper===>Department
* 不同 namespace 查出的数据会放在自己对应的缓存中 (map)
* 效果: 数据会从二级缓存中获取
* 查出的数据都会被默认先放在一级缓存中.
* 只有会话提交或者关闭以后, 一级缓存中的数据才会转移到二级缓存中
* 使用:
* 1), 开启全局二级缓存配置:<setting name="cacheEnabled" value="true"/>
* 2), 去 mapper.xml 中配置使用二级缓存:
* <cache></cache>
* 3), 我们的 POJO 需要实现序列化接口
*
* 和缓存有关的设置 / 属性:
* 1),cacheEnabled=true:false: 关闭缓存 (二级缓存关闭)(一级缓存一直可用的)
* 2), 每个 select 标签都有 useCache="true":
* false: 不使用缓存 (一级缓存依然使用, 二级缓存不使用)
* 3),[每个增删改标签的: flushCache="true":(一级二级都会清除)]
* 增删改执行完成后就会清楚缓存; 增删改默认 flushCache="true"
* 测试: flushCache="true": 一级缓存就清空了; 二级也会被清除;
- <cache type="org.mybatis.caches.ehcache.EhcacheCache">
- </cache>
- <!-- <cache eviction="FIFO" flushInterval="60000" readOnly="false" size="1024"></cache> -->
- <!-- eviction: 缓存的回收策略: • LRU - 最近最少使用的: 移除最长时间不被使用的对象. • FIFO - 先进先出:
- 按对象进入缓存的顺序来移除它们. • SOFT - 软引用: 移除基于垃圾回收器状态和软引用规则的对象. • WEAK - 弱引用: 更积极地移除基于垃圾收集器状态和弱引用规则的对象.
- • 默认的是 LRU. flushInterval: 缓存刷新间隔 缓存多长时间清空一次, 默认不清空, 设置一个毫秒值 readOnly:
- 是否只读: true: 只读; mybatis 认为所有从缓存中获取数据的操作都是只读操作, 不会修改数据. mybatis 为了加快获取速度,
- 直接就会将数据在缓存中的引用交给用户. 不安全, 速度快 false: 非只读: mybatis 觉得获取的数据可能会被修改. mybatis
- 会利用序列化 & 反序列的技术克隆一份新的数据给你. 安全, 速度慢 size: 缓存存放多少元素; type="": 指定自定义缓存的全类名;
- 实现 Cache 接口即可; -->
- ehcache-core-2.6.8.jar
- slf4j-API-1.6.1.jar
- slf4j-log4j12-1.6.2.jar
- <!-- 扫描所有的 mapper 接口的实现, 让这些 mapper 能够自动注入; base-package: 指定 mapper 接口的包名
- -->
- <mybatis-spring:scan base-package="com.atguigu.mybatis.dao" />
- <!-- 创建出 SqlSessionFactory 对象 -->
- <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="dataSource" ref="dataSource">
- </property>
- <!-- configLocation 指定全局配置文件的位置 -->
- <property name="configLocation" value="classpath:mybatis-config.xml">
- </property>
- <!--mapperLocations: 指定 mapper 文件的位置 -->
- <property name="mapperLocations" value="classpath:mybatis/mapper/*.xml">
- </property>
- </bean>
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <!-- 指定 mybatis 全局配置文件位置 -->
- <property name="configLocation" value="classpath:mybatis/mybatis-config.xml">
- </property>
- <!-- 指定数据源 -->
- <property name="dataSource" ref="dataSource">
- </property>
- <!--mapperLocations: 所有 sql 映射文件所在的位置 -->
- <property name="mapperLocations" value="classpath:mybatis/mapper/*.xml">
- </property>
- <!--typeAliasesPackage: 批量别名处理 -->
- <property name="typeAliasesPackage" value="com.atguigu.bean">
- </property>
- </bean>
- <!-- 自动的扫描所有的 mapper 的实现并加入到 ioc 容器中 -->
- <bean id="configure" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
- <!- basePackage: 指定包下所有的 mapper 接口实现自动扫描并加入到 IoC 容器中 -->
- <property name="basePackage" value="com.atguigu.dao">
- </property>
- </bean>
来源: http://www.bubuko.com/infodetail-3062916.html