SqlSession 线程安全问题
当你翻看 SqlSession 的源码时,你会发现它只是一个接口。我们通过 MyBatis 操作数据库,实际上就是通过 SqlSession 获取一个 JDBC 链接,然后操作数据库。
SqlSession 接口有 3 个实现类:
# | 实现类 |
---|---|
1 | DefaultSqlSession |
2 | SqlSessionManager |
3 | SqlSessionTemplate(在 mybatis-spring 包中) |
其中
-
DefaultSqlSession 的注释中很直接地标识:
Note that this class is not Thread-Safe.
。 -
SqlSessionManager 最终用到的也是 SqlSession ,因此它也是
not Thread-Safe
。 -
SqlSessionTemplate 倒是线程安全的,但是它在 mybatis-spring 包中,是用在 mybatis 和 spring 整合中的,暂时用不上。
因此,SqlSession 不应该是单例的,于此同时,依赖于 session 的 Mapper 要么也应该是多例的,要么就要用上 ThreadLocal !