mybatis缓存机制与陷阱

最近发现一段代码里相同的2句查询sql,第一次经过数据库查询出来,第二次却没有走数据库直接获得结果,那么他天然是拿的缓存里的数据,因而去研究了一下mybatis的缓存机制.
mybatis缓存分为一级缓存和二级缓存
一级缓存是做用于sqlsession的,缓存的数据在同一个sqlsession内生效.
二级缓存是做用于mapper的,缓存的数据在同一个namespace内生效.spring

一级缓存

操做数据库前咱们会先建立sqlsession对象,当同一个sqlsession查询2次相同的sql语句,第一次查询后会将查询到的数据写入缓存中,第二次再查询会直接拿缓存中的数据,不会再操做数据库,直到sqlsession执行了insert,update,delete操做并提交到数据库才会清空缓存,一级缓存是默认开启的.sql

二级缓存

二级缓存做用在mapper的同一个namespace,不一样的sqlsession两次执行相同的namespace下的 sql语句,第一次会将查询到的数据写入缓存中,第二次再查询会直接拿缓存中的数据,二级缓存是默认关闭的.数据库

明显以前的2次查询是不一样的sqlsession,二级缓存又没有开启,那第二次查询又为什么直接拿了缓存中的数据,通过一段时间的上网搜索,发现和我那段代码加了事务有关,mybatis在和spring集成后,会自动将session绑定到事务上,因此2次查询第二次会拿缓存中的结果.缓存

解决办法

在mapper配置文件中,给select加上flushCache="true",这样会清空缓存第二次会再去数据库查询.session

相关文章
相关标签/搜索