介绍
这篇文章给大家介绍使用弹簧与mybatis时出现一级缓存失效如何解决,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
mybatis的一级缓存是默认开启的,作用域是sqlSession,是基HashMap的本地缓存。不同的sqlSession之间的缓存数据区域互不影响。
当进行选择、更新、删除操作后并且提交事物到数据库之后,sqlSession中缓存的自动被清空
& lt;设置name=發ocalCacheScope"价值=https://www.yisu.com/zixun/盎峄啊?>
引用><强>结论强>
春天结合mybatis后,一级缓存作用:
在未开启事物的情况之下,每次查询,春天都会关闭旧的sqlSession而创建新的sqlSession,因此此时的一级缓存是没有启作用的
在开启事物的情况之下,春天使用threadLocal获取当前资源绑定同一个sqlSession,因此此时一级缓存是有效的
<强>案例强>
<强>情景一:未开启事物强>
@ service (“countryService") public class  CountryService { ,@ autowired ,private CountryDao  countryDao; ,//@Transactional 未开启事物 ,public void  noTranSactionMethod (), throws JsonProcessingException { CountryDo 才能;CountryDo =, countryDao.getById(1升); CountryDo 才能;countryDo1 =, countryDao.getById(1升); ObjectMapper 才能;ObjectMapper =, new objectmap (); String 才能;json =, objectMapper.writeValueAsString (countryDo); String 才能;json1 =, objectMapper.writeValueAsString (countryDo1); System.out.println才能(json); System.out.println才能(json1); ,} }测试案例:
@Test public void  transactionTest (), throws JsonProcessingException { ,countryService.noTranSactionMethod (); }结果:
(调试),SqlSessionUtils Creating a new SqlSession (调试),SpringManagedTransaction JDBC  Connection [com.mysql.jdbc.JDBC4Connection@14a54ef6], will not be managed by 春天 (调试),getById ==祝辞,准备:,SELECT *,得到country WHERE country_id =, ? (调试),getById ==祝辞,参数:,1(长) (调试),getById & lt;==,,总:1 (调试),SqlSessionUtils Closing  non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3359c978] (调试),SqlSessionUtils Creating  a new SqlSession (调试),SqlSessionUtils SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2aa27288], was not registered for synchronization because synchronization is not 活跃 (调试),SpringManagedTransaction JDBC  Connection [com.mysql.jdbc.JDBC4Connection@14a54ef6], will not be managed by 春天 (调试),getById ==祝辞,准备:,SELECT *,得到country WHERE country_id =, ? (调试),getById ==祝辞,参数:,1(长) (调试),getById & lt;==,,总:1 (调试),SqlSessionUtils Closing  non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2aa27288] {“countryId": 1、“country":“Afghanistan",“lastUpdate":“2006 - 02 - 15, 04:44:00.0"} {“countryId": 1、“country":“Afghanistan",“lastUpdate":“2006 - 02 - 15, 04:44:00.0"}可以看的到,两次查询,都创建了新的sqlSession,并向数据库查询,此时缓存并没有起效果
<强>情景二:开启事物强>
打开@ transactional注解:
@ service (“countryService") public class  CountryService { ,@ autowired ,private CountryDao  countryDao; ,@ transactional ,public void  noTranSactionMethod (), throws JsonProcessingException { CountryDo 才能;CountryDo =, countryDao.getById(1升); CountryDo 才能;countryDo1 =, countryDao.getById(1升); ObjectMapper 才能;ObjectMapper =, new objectmap (); String 才能;json =, objectMapper.writeValueAsString (countryDo); String 才能;json1 =, objectMapper.writeValueAsString (countryDo1); System.out.println才能(json); System.out.println才能(json1); ,} }使用原来的测试案例,输出结果:
(调试),SqlSessionUtils Creating a new SqlSession (调试),SqlSessionUtils Registering  transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@109f5dd8] (调试),SpringManagedTransaction JDBC  Connection [com.mysql.jdbc.JDBC4Connection@55caeb35], will be managed by 春天 (调试),getById ==祝辞,准备:,SELECT *,得到country WHERE country_id =, ? (调试),getById ==祝辞,参数:,1(长) null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null使用弹簧与mybatis时出现一级缓存失效如何解决