问题:一个方法调用2次mapper,同样的参数,第二次返回数据为空
打印sql:mybatis提示:
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1a81108e] from current transaction
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1a81108e]
原因分析:MyBatis的缓存机制,查看项目配置后发现问题在于第一次查询到结果会放到缓存中,程序对查到的结果list进行了remove操作,所以缓存中的list会发生变化,第二次查询时会从缓存中将操作过的list查找出来(mybatis返回的实体类的内存地址是相同的),故而产生了我们不需要的结果,之前项目中使用的是与Spring集成的,使用的session是SqlSessionTemplate,这里是默认关闭了一级缓存,而今天项目中没有与Spring集成,创建session使用的是SqlsessionFactory的openSession()方法,这里查找时默认会先从缓存中查询,综上,第二次我们查到的只是缓存中的数据.
解决方案:
方案一:通过SqlSessionUtils.getSqlSession(sqlSessionFactory).clearCache()方法刷新缓存
方案二:在mapper.xml对应的查找语句中添加flushCache=“true”