LocalCacheScope有俩个值,如下List-1所示 List-1 LocalCacheScope的值有枚举值 package org.apache.ibatis.session; /**...* @author Eduardo Macarron */ public enum LocalCacheScope { SESSION, STATEMENT } Configuration...中localCacheScope默认值是SESSION,如下List-2所示 List-2 Configuration的属性localCacheScope默认值是SESSION package org.apache.ibatis.session...protected LocalCacheScope localCacheScope = LocalCacheScope.SESSION; ......
一级缓存的作用域有两种,分别是 SESSION 和 STATEMENT ,可以通过修改配置项 localCacheScope 来设置,默认的 SESSION 会缓存一个会话中执行的所有查询,用来加速重复的嵌套查询...问题 下面看一下两个一级缓存导致的问题: 问题 1 当 localCacheScope 被设置为 SESSION 的时候,并且当前服务有多个实例时就可能会导致查询到的数据不一致。...设置为 statement 时,查询后会清除本地缓存 if (configuration.getLocalCacheScope() == LocalCacheScope.STATEMENT...但是当 localCacheScope 设置为 STATEMENT 时在返回查询结果前反而会去清空缓存,到这里基本介绍完了 MyBatis 一级缓存的所有内容。...分布式应用推荐都把 localCacheScope 设置为 STATEMENT。 如果只是要避免问题 2 也可以简单的把查询的数据进行深拷贝,避免因为浅拷贝的问题造成数据异常的问题。
虽然我们不能关闭一级缓存,但是我们可以更改他的作用范围: MyBatis提供了一个配置参数localCacheScope,用于控制一级缓存的级别,该参数的取值为SESSION、STATEMENT,当指定...localCacheScope参数值为SESSION时,缓存对整个SqlSession有效,只有执行DML语句(更新语句)时,缓存才会被清除。...当localCacheScope值为STATEMENT时,缓存仅对当前执行的语句有效,当语句执行完毕后,缓存就会被清空。... 能更改一级缓存的作用范围这一点很重要后面我们讲解中会用到这一特性...设置方式:
其次,再来跟踪一下参数localCacheScope的使用场景。 如下为MyBatis执行查询的时序图: ?...另外,当参数localCacheScope值为STATEMENT时,每次查询之后都会清空BaseExecutor的本地缓存。...内部的缓存策略 缓存实现原理分析 既然在MyBatis中是通过cacheEnabled和localCacheScope这2个参数来控制缓存的,那么如下的实现原理分析也基于这2个参数进行。...参数localCacheScope的有效值分别为SESSION,STATEMENT,当该参数值为STATEMENT时,每次查询操作都会清空BaseExecutor中的本地缓存。...参数cacheEnabled控制的缓存策略 在了解了参数localCacheScope控制的缓存策略之后,还需要继续研究参数cacheEnabled所控制的缓存策略。
statements. https://mybatis.org/mybatis-3/sqlmap-xml.html#select 其中:onfiguration.getLocalCacheScope() 为LocalCacheScope.SESSION...if possible) to add such option https://github.com/mybatis/mybatis-3/issues/1278 在分布式环境下,一定要将MyBatis的localCacheScope...一级缓存默认开启而且不能关闭,可以设置localCacheScope属性设置为STATEMENT,查询时清空一级缓存。
在执行update、insert、delete、flushCache="true"、commit、rollback、LocalCacheScope.STATEMENT等情况下,一级缓存就都会被清空。...LocalCacheScope.STATEMENT时,一级缓存会被清空。在BaseExecutor里的query方法中: 事务提交回滚时,一级缓存会被清空。...清空一级缓存的方式有: update、insert、delete flushCache="true" commit、rollback LocalCacheScope.STATEMENT
使用 REQUIRES_NEW 属性可以确保不管初始事务的结果如何,审计数据都会被保存 mybatis缓存 Mybatis-config.xml中可以配置mybatis的本地缓存范围localCacheScope...系统默认值是SESSION,为了不使用mybatis缓存,设置为STATEMENT --> 使用以下配置可以打印出...系统默认值是SESSION,为了不使用mybatis缓存,设置为STATEMENT --> 解决这个问题对于
具体配置方式如下: 在上面的配置中,我们将localCacheScope设置为STATEMENT,表示关闭一级缓存。
开启一级缓存 MyBatis的配置文件加上如下: 注意:localCacheScope 值有两个 SESSION
禁用缓存配置: <setting name="<em>localCacheScope</em>
extends Log> logImpl; protected LocalCacheScope localCacheScope = LocalCacheScope.SESSION; protected
Mybatis 的配置文件(通常是 mybatis-config.xml)中,可以通过以下配置来开启或关闭一级缓存: 使用 localCacheScope 设置来开启或关闭一级缓存。
--> <setting name="<em>localCacheScope</em>
MyBatis一缓存默认是开启的,不需要任何配置(localCacheScope=STATEMENT相当于关闭一级缓存)。...可以在BaseExecutor的query()方法中找到localCacheScope清除逻辑: if (configuration.getLocalCacheScope() == LocalCacheScope.STATEMENT
} // issue #601 deferredLoads.clear(); if (configuration.getLocalCacheScope() == LocalCacheScope.STATEMENT...) { // issue #482 clearLocalCache(); } } return list; } localCacheScope...控制全局缓存(二级缓存),默认 true--> <setting name="<em>localCacheScope</em>...); } // issue #601 deferredLoads.clear(); if (configuration.getLocalCacheScope() == <em>LocalCacheScope</em>.STATEMENT...配置为 二级缓存 ? .
cn.bugstack.mybatis.session.Configurationpublic class Configuration { // 缓存机制,默认不配置的情况是 SESSION protected LocalCacheScope...localCacheScope = LocalCacheScope.SESSION; // 映射注册机 protected MapperRegistry mapperRegistry =...queryStack--; } if (queryStack == 0) { if (configuration.getLocalCacheScope() == LocalCacheScope.STATEMENT
cn.bugstack.mybatis.session.Configuration public class Configuration { // 缓存机制,默认不配置的情况是 SESSION protected LocalCacheScope...localCacheScope = LocalCacheScope.SESSION; // 映射注册机 protected MapperRegistry mapperRegistry...queryStack--; } if (queryStack == 0) { if (configuration.getLocalCacheScope() == LocalCacheScope.STATEMENT
设置本地缓存范围 session:就会有数据的共享 statement:语句范围 (这样就不会有数据的共享 ) defalut:session --> <setting name="<em>localCacheScope</em>
this.deferredLoads.clear(); if (this.configuration.getLocalCacheScope() == LocalCacheScope.STATEMENT...ms.isFlushCacheRequired()) { clearLocalCache(); } 另外一处是 if (configuration.getLocalCacheScope() == LocalCacheScope.STATEMENT
领取专属 10元无门槛券
手把手带您无忧上云