mybatis一级缓存
默认情况下,mybatis会启用本地的会话
缓存,这就是mybatis的一级缓存,作用域是SqlSession
原理:
mapper接口调用的时候后会创建一个新的SqlSession
,如果每次都使用一个新的SqlSession
mybatis一级缓存就不会生效,一级缓存必须同一个SqlSession
。
验证
testGetById使用事务:mapper接口调用的时候产生一个SqlSession
,再次调用复用同一个SqlSession
testGetById不使用事务:产生多个SqlSession
# 打印mybatis日志
logging:
level:
org.mybatis: debug
每次生成SqlSession
控制台会打印一下日志。
2021-11-19 14:26:09.785 DEBUG 5068 --- [ main] org.mybatis.spring.SqlSessionUtils : Creating a new SqlSession
@Repository
public interface UserMapper {
User selectById(int id);
}
@Service
@Slf4j
public class UserServiceImpl implements UserService {
@Autowired UserMapper userMapper;
@Override
@Transactional
public void testGetById() {
while(true) {
User user = userMapper.selectById(1);
System.err.println("success");
log.info("user={}", user);
try {
Thread.sleep(1000 * 3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceImplTest {
@Autowired UserService userService;
@Test
public void testUserMapper() {
userService.testGetById();
}
}