最近发现一段代码里相同的2句查询sql,第一次通过数据库查询出来,第二次却没有走数据库直接得到结果,那么他自然是拿的缓存里的数据,于是去研究了一下mybatis的缓存机制.
mybatis缓存分为一级缓存和二级缓存一级缓存是作用于sqlsession的,缓存的数据在同一个sqlsession内生效.二级缓存是作用于mapper的,缓存的数据在同一个namespace内生效.一级缓存
操作数据库前我们会先创建sqlsession对象,当同一个sqlsession查询2次相同的sql语句,第一次查询后会将查询到的数据写入缓存中,第二次再查询会直接拿缓存中的数据,不会再操作数据库,直到sqlsession执行了insert,update,delete操作并提交到数据库才会清空缓存,一级缓存是默认开启的.
二级缓存
二级缓存作用在mapper的同一个namespace,不同的sqlsession两次执行相同的namespace下的 sql语句,第一次会将查询到的数据写入缓存中,第二次再查询会直接拿缓存中的数据,二级缓存是默认关闭的.
明显之前的2次查询是不同的sqlsession,二级缓存又没有开启,那第二次查询又为何直接拿了缓存中的数据,经过一段时间的上网搜索,发现和我那段代码加了事务有关,mybatis在和spring集成后,会自动将session绑定到事务上,所以2次查询第二次会拿缓存中的结果.
解决办法
在mapper配置文件中,给select加上flushCache="true",这样会清空缓存第二次会再去数据库查询.