mybatis缓存,返回的地址一样

mybatis 配置了缓存之后  当查询条件相同时,返回的对象的hash值是一样的      ,如果要返回的地址不以一样需要将查询结果clone  然后返回。
### MyBatis 一级缓存与二级缓存的区别 #### 一级缓存的作用域和特性 MyBatis 的一级缓存存在于 `SqlSession` 实例级别。这意味着只要同一个 `SqlSession` 中执行相同的 SQL 查询语句,就会尝试从该会话内部的缓存读取结果而不是再次发送请求给数据库获取数据[^1]。 当应用程序在一个事务范围内多次调用相同参数的方法时,第一次查询之后的结果会被保存到当前 SqlSession 对象中的缓存里,在这个期间内如果有同样的查询需求,则直接返回之前存储好的记录集从而减少不必要的 IO 开销并提升效率[^3]。 然而得注意的是,默认情况下每次提交或回滚后此级别的缓存都将失效,并且任何更新、删除或者插入操作也会使整个 Session 下的所有映射文件对应的表的相关缓存全部清除掉以保持最新状态。 ```java // 创建一个新的 SqlSession try (SqlSession session = sqlSessionFactory.openSession()) { // 执行第一个查询 User userFirstQuery = session.selectOne("getUserById", userId); // 同一 SqlSession 再次执行完全一样查询不会触发实际SQL执行而是命中了一级缓存 User userSecondQuery = session.selectOne("getUserById", userId); } ``` #### 二级缓存的作用域和特性 相比之下,MyBatis 的二级缓存则跨越了不同 `SqlSession` 实例之间的界限。它能够使得在整个 Mapper 映射器层面共享同一份缓存实例,即所有使用相同命名空间(namespace)下的 mapper 文件所创建出来的对象都可以利用这份公共区域来交换信息。 为了启用这种更高级别的持久化层优化措施,开发者需要显式开启全局设置 `<setting name="cacheEnabled" value="true"/>` 并为特定的 Mapper 配置相应的 `<cache/>` 或者自定义 Cache 类型标签[^2]。 不过由于涉及到多线程环境下的并发控制以及潜在的数据同步风险等问题,因此官方建议仅针对那些很少发生变更的数据集合才考虑应用此类策略以免造成脏读现象或其他不可预见的行为影响业务逻辑准确性。 ```xml <!-- 在 mybatis-config.xml 中 --> <settings> <!-- 全局开关用于决定是否允许使用任意类型的二级缓存 --> <setting name="cacheEnabled" value="true"/> </settings> <mappers> <!-- 声明要使用的Mapper XML文件路径 --> <mapper resource="com/example/mapper/UserMapper.xml"/> </mappers> ``` ```xml <!-- 在具体的 Mapper XML 文件中 --> <mapper namespace="com.example.mapper.UserMapper"> <!-- 定义本 Namespace 使用默认 PerpetualCache 缓存实现 --> <cache/> <!-- 或者指定其他第三方插件提供的分布式缓存方案 --> <!--<cache type="org.apache.ibatis.cache.decorators.LoggingCache">--> <!--<property name="delegate" ref="ehcache"/>--> <!--</cache>--> </mapper> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值