mybatis 相关

93 阅读1分钟

mybtis 缓存

  1. mybatis 一级缓存默认是开启的,但与 spring 整合后,每次查询都是新的 SQLSession,所以一级缓存会失效。 而在方法上加 @Transactional 将原本的 DefaultSqlSession 替换成了 SqlSessionTemplate,并且在 SqlSessionTemplate 将 sqlSession替换成了代理对象,当我们执行 sqlSession.selectList 方法的时候会调用到 SqlSessionInterceptor的invoke方法, 在 invoke 方法的fianlly中调用了 SqlSessionUtils.closeSqlSession(sqlSession, SqlSessionTemplate.this.sqlSessionFactory) 将我们的 session 关闭了。原生的 mybatis 之所以没有关闭session 是因为它把 session 暴露给我们了,而和 spring 结合使用的时候并没有提供暴露 session 的方法,所以只能在这里关,而一旦 session 关闭了,那一级缓存自然也就失效了。

修改信息导致全表修改

有次数据库表里的字段任务状态全改成一样的了,因为知道是哪个方法,去排查就定位到那个修改方法

大概逻辑是:先根据条件查出一个未解析的 ID 集合,然后传入这个 ID 用 in 修改状态,但是前端连点了,不知道为什么没限制住

原因:第一个请求把状态改过了,没有未解析的 ID 了,第二个任务又来查到 ID 集合为空集合,然后修改的时候根据空集合 in 修改,就把全表修改了

解决方案: 尽量避免复用别人的方法,增加必传参数校验,加分布式锁

为什么加分布式锁: 多节点,连点之后可能存在多次修改这条数据的状态,如果两台节点同时执行,有可能存在同时越过某个判断,导致重复新增或修改