PageHelper 使用 ThreadLocal 的线程复用问题,你用对了吗?

PageHelper 使用 ThreadLocal 的线程复用问题,你用对了吗?,第1张

PageHelper 是较为常用的分页插件,通过实现 Mybatis 的 Interceptor 接口完成对 query sql 的动态分页,其中分页参数由 ThreadLocal 进行保存。

简单的 分页执行过程:

观察上述的执行过程,可以发现,如果在第 1 步和第 2 步 之间发生异常,那么 LOCAL_PAGE 中当前线程对应的 page 参数并不会 remove。

在不使用线程池的情况下,当前线程在执行完毕后会被销毁,这时 当前线程 中的 threadLocals 参数 将会被情况,也就清空 了 LOCAL_PAGE 中 当前线程的 page 参数。

但是如果使用了线程池,当前线程执行完毕,并不会被销毁,而是会将当前线程再次存放到池中,标记为空闲状态,以便后续使用。在后续使用这个线程的时候,由于 线程 的 threadLocals 依旧存在有值,尽管我们在第 1 步时未设置 page 参数,第 3 步 的也能获取到page参数,从而生成 count sql 和 page sql ,从而影响我们的正常查询。

SpringBoot 项目中会使用内置的 Tomcat 作为服务器,而Tomcat会默认使用线程来处理请求,从而便引发了上述问题。

因为Tomcat的线程是用来处理request请求,那么在请求完成时,清空当前线程的threadLocals 属性值,也就是执行 LOCAL_PAGEremove() 即可。实现方式:

这里使用第二种方式,实现 HandlerInterceptor 接口:

定义配置类,配置类需实现 WebMvcConfigurer 接口完成对于WebMvc的相关配置 ,注册 PageLocalWebInterceptor :

1、 安装DNS服务。

开始-〉设置-〉控制面板-〉添加/删除程序-〉添加/删除Windows组件-〉“网络服务”-〉选择“域名服务系统(DNS)”-〉按确定进行安装。

2、 创建DNS正相解析区域

开始-〉程序-〉管理工具-〉选择DNS,打开DNS控制台-〉右击“正相搜索区域”-〉选择“新建区域”-〉选择“标准主要区域”(或“Active Directory 集成区域”或“标准辅助区域”)--〉输入域名“abccom” -〉输入要保存的区域的文件名“abccomdns”- 〉按完成,完成创建。

创建主机记录等: 右击“abccom”-〉“新建主机” -〉在名称处输入“>

3、 创建DNS反向解析区域。

开始-〉程序-〉管理工具-〉选择DNS,打开DNS控制台-〉右击“反向搜索区域”-〉选择“新建区域”-〉选择“标准主要区域”-〉输入用来标示区域的“网络ID”-〉输入要保存的区域的文件名“0168192in-addrarpadns”-〉按完成,完成创建。

创建指针PTR: 右击“1921681xsubnet”-〉选择“新建指针”-〉在“主机IP号”中输入2-〉在“主机名”中输入ftp-按 “确定”完成添加。

4、 启用DNS循环复用功能。

右击选择“DNS服务器”-〉属性-〉高级-〉选择“启用循环”(round robin)--〉选择“启用netmask 排序”-〉按“ 确定”返回。

5、 创建标准辅助区域,实现DNS区域复制。

在另一台DNS服务器上,右击“正向搜索区域”-〉选择“新建区域”-〉选择“标准辅助区域”-〉输入“abccom”-〉输入主域名服务器的IP地址-〉选择“完成”。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/13479100.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-15
下一篇 2023-08-15

发表评论

登录后才能评论

评论列表(0条)

保存