PageHelper原理

使用方法:
 PageHelper.startPage(page, rows);//第一句
 Query(params);//第二句

问题一:

看似第一句和第二句没有任何关系,为何第一句会影响第二句?


答案:通过ThreadLocal传递pageNum、pageSize变量

ThreadLocal把分页变量pageNum和pageSize传给mybatis拦截器(一条判断是否存在ThreadLocal变量的判断语句),如果mybatis拦截到ThreadLocal中的变量,会将page和rows变量取出,重新拼接到sql上。


问题二:

ThreadLocal有没有自动销毁机制,如果存在两条sql,第二题sql会不会用第一条sql的ThreadLocal,即两次请求会不会互相影响?


答案:两次请求不会互相影响

第一种情况:如果两次sql请求在线程池里面不同的线程中,则ThreadLocal里面存的page和rows变量必然不会互相影响,因为ThreadLocal是线程内变量。

第二种情况:如果两次sql请求在线程池里面的同一个线程中,则两次sql请求是并发的,即有先后顺序,第二次sql请求不会受到第一次sql请求的ThreadLocal的影响,在源码中可以发现:

protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal();

因此每有一次sql请求,都会new一个ThreadLocal,两次sql请求是两个完全不同的ThreadLocal对象。第二次sql请求不会受第一次sql请求所产生的的ThreadLocal的影响。

参考:https://blog.csdn.net/qq_21996541/article/details/79796117
https://my.oschina.net/zudajun/blog/745232

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值