• 请不要在回答技术问题时复制粘贴 AI 生成的内容
jwh199588
V2EX  ›  程序员

mybatis plus 分页问题

  •  
  •   jwh199588 · Jun 30, 2023 · 3406 views
    This topic created in 1224 days ago, the information mentioned may be changed or developed.
    select * from t_notice_info tni order by create_time  desc limit ? limit ?,?
    

    项目里面同时使用了 PageHelper 和 mybatis plus 的 page 方法,但是在一次查询中只使用了 mybatis plus 的分页查询,结果出现了上面的问题,目前我知道主要是 PageInterceptor 拦截器错误识别对象导致的,但是我本地没办法复现问题,有哪位遇到过,可以解释一下吗

    14 replies  •  2023-06-30 18:22:09 +08:00
    Vcccc
    Vcccc
    Jun 30, 2023
    1
    如果是 springboot 项目,可以试试加一个 HandlerInterceptor ,然后再清空 PageHelper 的参数。原因大概是上一个查询报错了,然后当前线程保留了上一个分页参数,这里的做法就是,请求结束后,都做一次清空分页参数。
    public class PageHelperInterceptor implements HandlerInterceptor {

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    PageHelper.clearPage();
    }
    }

    @Configuration
    public class WebConfigurer implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new PageHelperInterceptor()).addPathPatterns("/**");
    }
    }
    fantaxi
    fantaxi
    Jun 30, 2023
    2
    是不是参数没清空导致的,每次查询完我都 PageHelper.clearPage() 一下
    jwh199588
    jwh199588
    OP
    Jun 30, 2023
    3
    @Vcccc 根据你的意思,我看了一下代码,发现这个方法只分页查询了一次,没有其他查询了,应该不会触发呀
    jwh199588
    jwh199588
    OP
    Jun 30, 2023
    4
    @fantaxi 我奇怪的点就是我这个方法里面并没有用到 PageHelper ,用的是 mybatis plus 的 page 方法
    Laysan
    Laysan
    Jun 30, 2023
    5
    干掉 PageHelper
    zzzmh
    zzzmh
    Jun 30, 2023
    6
    不用 PageHelper ,就用 mybatisplus 自带的分页就行,可以自己写个工具类去辅助下,比如优化一下返回值。
    SilentRhythm
    SilentRhythm
    Jun 30, 2023
    7
    PageHelper 是 Thread 级别的拦截器,然后线程是复用的,实际上是线程泄露导致。
    同一条线程只要调用了 PageHelper.startPage()没有紧跟.doSelectPageInfo()就会导致上述这种不明所以的拦截。

    建议排查整个项目的 PageHelper.startPage(pageNum, pageSize)调用,
    然后改成紧跟 lambda 的写法
    PageHelper.startPage(pageNum, pageSize).doSelectPageInfo(() -> 实现)
    SilentRhythm
    SilentRhythm
    Jun 30, 2023
    8
    SilentRhythm
    SilentRhythm
    Jun 30, 2023
    9
    接上,建议参考源码:
    com.github.pagehelper.page.PageMethod#startPage
    com.github.pagehelper.page.PageMethod#setLocalPage
    com.github.pagehelper.PageInterceptor#intercept
    com.github.pagehelper.PageHelper#afterAll
    Vcccc
    Vcccc
    Jun 30, 2023
    10
    @jwh199588 如果单独看日志来定位错误的点是有很大局限性的。看看 #7 给你的回复,回答的还算是比较详细,并且跟我认为错误的点很契合
    RainCats
    RainCats
    Jun 30, 2023
    11
    没遇到过这个问题
    crazykk
    crazykk
    Jun 30, 2023
    12
    是的,我记得 github 上有作者提到这种错误,要紧跟查询,同 7 楼的说法
    vvvVictoria
    vvvVictoria
    Jun 30, 2023
    13
    try (Page<T> p = PageHelper.startPage(pageNo, pageSize)) {

    }
    curvatureship
    curvatureship
    Jun 30, 2023
    14
    有可能是依赖版本的问题,PageHelper 和 MybatisPlus 分页共存遇到过类似的问题,查看错误日志排查后是因为 PageHelper 和 MybatisPlus 共同依赖的 jsqlparder 版本不一致导致的,调整版本后两者能共存没问题
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2486 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 15:02 · PVG 23:02 · LAX 07:02 · JFK 10:02
    ♥ Do have faith in what you're doing.