Mybatis的事务、缓存

本文介绍MyBatis中的事务管理和缓存机制,包括基于Transaction接口的事务管理配置及使用,一级缓存与二级缓存的区别与配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该文章基于《Spring+MyBatis企业应用实战》进行总结,旨在积累巩固

事务

Mybatis事物的设计都是基于Transaction接口来进行的:
这里写图片描述
该接口实际上是使用模板设计模式进行设计,可以看见该接口实际上有两个实现类:
一个为ManagedTransaction:由容器实现对事务的管理,单独使用commit和rollback没有任何效果
一个为JdbcTransaction:由java.sql.Connection完成对事物的管理
实际的配置需要在mybatis-config.xml中进行:

<environments default="mysql">
    <!-- 环境配置,即连接的数据库。 -->
    <environment id="mysql">
    <!--  指定事务管理类型,type="JDBC"指直接简单使用了JDBC的提交和回滚设置 -->
        <transactionManager type="JDBC"/>
        <!--配置数据源-->
        <dataSource type="POOLED">
            <!--对数据源进行配置-->
        </dataSource>
    </environment>
</environments>

具体的获得Transaction方式是通过在构造函数中传入已经构造好的Connection,之后对JdbcTransaction的commit和rollback都会通过该connection实现,而ManagedTransaction将rollback和commit写空,具体是创建哪种Transaction将由TransactionFactory去实现。

缓存

mybatis中的缓存一共分为两种缓存:

一级缓存

一级缓存是SqlSession级别的缓存,请注意只有查询会进行缓存,加入出现了对数据进行修改的DML操作(insert、update和delete)并进行了提交将会对缓存进行清空,一级缓存默认开启

二级缓存

二级缓存是mapper级别的缓存,也就可以理解为如果多个SqlSession使用同一个Mapper去进行获取信息的话,获取的信息将会在多个SqlSession之间进行共用。二级缓存默认不开启,需要通过在mybatis-config.xml显式的进行开启:

<settings>
    <setting name="cacheEnabled" value="true"/>
</settings>

并且还需要再XXXMapper.xml中进行二级缓存的配置:

<mapper>
    <cache eviction="LRU" flushInterval="多少毫秒进行一次刷新" size="可以存储多少对象" readOnly="true/false返回对象是否只可读"/>
    <!--如果返回可读写的缓存,那么需要通过序列化返回缓存对象的拷贝,会造成数据损失。所以readOnly属性主要用于性能优化-->
</mapper>

如果想在某些方法上设置禁用二级缓存,可以通过设置useCache属性为false来禁用缓存。

<think>好的,我现在需要帮助用户找到MyBatis集成缓存的应用案例,并提供一个实例教程的最佳实践。首先,我需要回顾用户提供的引用内容,确保答案准确并符合他们的需求。 根据引用[1],MyBatis是一个支持定制化SQL和高级映射的持久层框架,避免了大量JDBC代码。引用[2]提到,MyBatis在Spring集成时,一级缓存在Service方法结束后会被清空,因此多次Service调用不会命中一级缓存。而二级缓存是跨SqlSession的,需要注意事务管理。引用[4]则详细说明了本地缓存的作用域和如何控制缓存失效,例如通过设置localCacheScope或flushCache属性。 用户需要的是集成缓存的实际案例,特别是最佳实践。我需要结合这些引用内容,给出一个清晰的步骤说明,并附上代码示例。可能的结构包括:配置二级缓存,使用第三方缓存库如Ehcache,以及在分页场景下的缓存应用。 首先,配置二级缓存需要在MyBatis的XML映射文件中开启<cache/>标签,并设置相关属性。然后,在Spring Boot中整合Ehcache,需要添加依赖,配置ehcache.xml,并在MyBatis中指定缓存实现。同时,需要注意事务的作用域,避免脏数据,如引用[2]提到的Service层事务控制。 分页插件的缓存应用,如引用[3]提到的PageHelper,需要说明如何与缓存结合使用,避免分页查询时的缓存问题。此外,引用[4]提到的flushCache属性可以在特定查询中禁用缓存,这可能在某些场景下有用。 需要检查每个步骤的代码是否正确,例如Ehcache的配置是否正确,MyBatis的mapper文件是否启用了缓存。同时,确保提到的注意事项,如缓存策略的选择、事务管理和监控,都是最佳实践的一部分。 可能的问题点:用户可能不清楚一级缓存和二级缓存的具体区别,以及如何在Spring环境中正确配置。需要明确说明两者的生命周期和作用域,尤其是在Service层的事务影响下,一级缓存可能不生效的情况,如引用[2]所述。 总结下来,回答的结构应该是:配置二级缓存、整合Ehcache、分页插件的缓存处理,以及注意事项。每个部分给出代码示例,并引用相关段落支持观点。最后生成相关问题,帮助用户进一步探索。</think>### MyBatis 集成缓存实例教程与最佳实践 #### 1. 二级缓存基础配置 在 MyBatis 中,二级缓存默认是关闭的。需在映射文件中添加 `<cache/>` 标签开启: ```xml <!-- UserMapper.xml --> <mapper namespace="com.example.UserMapper"> <cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/> <select id="selectUserById" resultType="User" useCache="true"> SELECT * FROM user WHERE id = #{id} </select> </mapper> ``` 此配置表示: - 使用 `LRU` 淘汰策略 - 60秒刷新缓存 - 最大存储512个对象 - 只读模式(适合不变数据)[^4] #### 2. Spring Boot + Ehcache 整合 **步骤 1:添加依赖** ```xml <dependency> <groupId>org.mybatis.caches</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.2.2</version> </dependency> ``` **步骤 2:创建 ehcache.xml** ```xml <ehcache> <diskStore path="java.io.tmpdir"/> <defaultCache maxEntriesLocalHeap="1000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600" diskSpoolBufferSizeMB="30"/> </ehcache> ``` **步骤 3:修改 MyBatis 配置** ```xml <mapper namespace="com.example.UserMapper"> <cache type="org.mybatis.caches.ehcache.EhcacheCache"/> </mapper> ``` #### 3. 分页查询的缓存处理 当使用类似 PageHelper 的分页插件时(参考引用[3]),需注意: ```java // 开启分页前清空缓存 PageHelper.startPage(1, 10).setFlushCache(true); List<User> users = userMapper.selectUsers(); ``` 对于需要强制刷新的查询: ```xml <select id="selectActiveUsers" resultType="User" flushCache="true"> SELECT * FROM user WHERE status = 'ACTIVE' </select> ``` #### 4. 最佳实践建议 1. **缓存策略选择** - 高频读低频写数据:推荐二级缓存 - 实时性要求高数据:设置短 TTL 或关闭缓存 - 关联查询数据:使用 `<cache-ref>` 建立缓存引用 2. **事务管理要点** ```java @Transactional public void updateUser(User user) { userMapper.update(user); // 更新操作会自动清空二级缓存[^2] // 建议在事务提交后手动清除相关缓存 sqlSession.clearCache(); } ``` 3. **监控与调试** ```properties # application.properties logging.level.org.mybatis=DEBUG ``` #### 典型应用场景 1. 电商平台商品分类信息缓存 2. 新闻系统热点文章内容缓存 3. 用户权限数据缓存(结合刷新机制)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值