对绝大数Java开发者而言mybatis并不陌生,从经典的SSM(Spring,spring-mvc,mybatis)框架,到现在流行的Springboot,随处可见mybatis的身影。mybatis作为比较主流的orm框架,支持用户定制sql,灵活又方便,颇受开发者喜爱。我们在使用mybatis难免会遇到各种坑,其中SqlSession的线程安全性问题也总会遇到。
SqlSession作为一个接口,其并没有线程安全性的问题,我们常说的线程安全问题是SqlSession的一个实现类DefaultSqlSession,mybatis的作者也对此类加以"Note that this class is not Thread-Safe"的注释。此外SqlSession还有两个实现类SqlSessionManager和SqlSessionTemplate,这两个实现类是线程安全的。
线程不安全的DefaultSqlSession
我们都知道DefaultSqlSession是线程不安全的,也会有很多博主讲解"SqlSessionTemplate是如何保证DefaultSqlSession线程安全的",但是DefaultSqlSession不安全的体现是什么?不安全产生的原因在哪?今天作者通过一个例子给读者演示下并发情况下DefaultSqlSession线程不安全的表现,以及源码追踪产生线程安全问题的源头。
样例代码如下:
配置文件mybatis-config.xml,简单配置保证能正常运行