pagehelper / Mybatis-PageHelper

Mybatis通用分页插件
https://mybatis.io
MIT License
12.22k stars 3.13k forks source link

线程安全问题 #271

Closed cx422803902 closed 6 years ago

cx422803902 commented 6 years ago

5+版本的分页插件应该是存在线程安全问题的。 在mybatis的插件中,每一种插件实际上都是只有一个实例的。当有多个线程同时做数据库操作时,就会有多个线程同时操作PageInterceptor这个单例,从而对PageIngerceptor#dialect和msCountMap这两个变量操作。 1.在线程A中对PageIngerceptor#dialect做了赋值的操作,并对dialect做修改 2.在线程B中又重新对PageIngerceptor#dialect做了赋值操作, 。。。如此会有问题的

abel533 commented 6 years ago

第一眼看到这个问题时我以为没考虑动态数据源,所以以为是bug。

后来仔细看了看,动态数据源在 PageAutoDialect 中用 ThreadLocal 处理了。

PageInterceptor 中的 dialect 只会初始化一次,即使你配置多个拦截器插件,也都是各自的 dialect。不会出现多线程时多次赋值。

cx422803902 commented 6 years ago

哦哦。当时看的是5.1.4版本的,当时因为https://github.com/pagehelper/Mybatis-PageHelper/issues/26所以改了源码,初始化没做判断所以初始化了多次了