baomidou / mybatis-plus

An powerful enhanced toolkit of MyBatis for simplify development
https://baomidou.com
Apache License 2.0
16.25k stars 4.29k forks source link

selectOne方法被加limit分页 #6260

Closed littlebearrun closed 2 months ago

littlebearrun commented 2 months ago

baseMapper.selectOne(new QueryWrapper().lambda() .eq(xxxx) .eq(xxxx) .last("LIMIT 1")); 就是简单的controller请求进来查询了这一次
报错后提示语句异常,发现打印出的语句LIMIT 1后面又加了limit 10,偶发了 一次,没再复现,想问一下,什么情况下会出现这种异常?

ESCATS commented 2 months ago

看看日志

miemieYaho commented 2 months ago

你用了pagehelper吧

zhaokjun commented 2 months ago

估计是上一次查询的时候用了pagehelper,然后某种原因(比如在查sql前报错、if else中遗漏了一些情况)导致没有办法清空pagehelper的threadlocal,后续调用其他接口时刚好是原来的线程在执行,然后就被加了limit 10

zhaokjun commented 2 months ago

补充一点:调用了pagehelper.startPage方法后必须对数据库进行一次操作或者手动调用clear方法才能清空threadlocal

littlebearrun commented 2 months ago

估计是上一次查询的时候用了pagehelper,然后某种原因(比如在查sql前报错、if else中遗漏了一些情况)导致没有办法清空pagehelper的threadlocal,后续调用其他接口时刚好是原来的线程在执行,然后就被加了limit 10

明白你的意思了,有可能是复用了其他带着分页信息的线程

yujijiwawa commented 1 month ago

估计是上一次查询的时候用了pagehelper,然后某种原因(比如在查sql前报错、if else中遗漏了一些情况)导致没有办法清空pagehelper的threadlocal,后续调用其他接口时刚好是原来的线程在执行,然后就被加了limit 10

明白你的意思了,有可能是复用了其他带着分页信息的线程

不同的请求,为什么会使用其他线程的参数呢?

zhaokjun commented 1 month ago

估计是上一次查询的时候用了pagehelper,然后某种原因(比如在查sql前报错、if else中遗漏了一些情况)导致没有办法清空pagehelper的threadlocal,后续调用其他接口时刚好是原来的线程在执行,然后就被加了limit 10

明白你的意思了,有可能是复用了其他带着分页信息的线程

不同的请求,为什么会使用其他线程的参数呢?

  1. 不同的请求都是复用的线程池里的线程,每个请求在没开启新的线程的情况下,都是在一个线程里运行的
  2. 每个线程都有一个ThreadLocal存储,pagehelper使用的是线程自己的ThreadLocal存储。
  3. 使用的不是其他线程的参数,还是那一个线程,如果你将线程名称打印出来,名称相同就算同一个线程(前提是每个线程名称没有人为设置为一样的)。pagehelper使用的是当前线程的ThreadLocal里的参数,只是上一次请求后参数没被清理,导致pagehelper错误拼接了sql。