使用弹簧与mybatis时出现一级缓存失效如何解决

  介绍

这篇文章给大家介绍使用弹簧与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时出现一级缓存失效如何解决