baseMapper.selectOne(new QueryWrapper
报错后提示语句异常,发现打印出的语句LIMIT 1后面又加了limit 10,偶发了 一次,没再复现,想问一下,什么情况下会出现这种异常?
Comment From: ESCATS
看看日志
Comment From: miemieYaho
你用了pagehelper吧
Comment From: zhaokjun
估计是上一次查询的时候用了pagehelper,然后某种原因(比如在查sql前报错、if else中遗漏了一些情况)导致没有办法清空pagehelper的threadlocal,后续调用其他接口时刚好是原来的线程在执行,然后就被加了limit 10
Comment From: zhaokjun
补充一点:调用了pagehelper.startPage方法后必须对数据库进行一次操作或者手动调用clear方法才能清空threadlocal
Comment From: littlebearrun
估计是上一次查询的时候用了pagehelper,然后某种原因(比如在查sql前报错、if else中遗漏了一些情况)导致没有办法清空pagehelper的threadlocal,后续调用其他接口时刚好是原来的线程在执行,然后就被加了limit 10
明白你的意思了,有可能是复用了其他带着分页信息的线程
Comment From: yujijiwawa
估计是上一次查询的时候用了pagehelper,然后某种原因(比如在查sql前报错、if else中遗漏了一些情况)导致没有办法清空pagehelper的threadlocal,后续调用其他接口时刚好是原来的线程在执行,然后就被加了limit 10
明白你的意思了,有可能是复用了其他带着分页信息的线程
不同的请求,为什么会使用其他线程的参数呢?
Comment From: zhaokjun
估计是上一次查询的时候用了pagehelper,然后某种原因(比如在查sql前报错、if else中遗漏了一些情况)导致没有办法清空pagehelper的threadlocal,后续调用其他接口时刚好是原来的线程在执行,然后就被加了limit 10
明白你的意思了,有可能是复用了其他带着分页信息的线程
不同的请求,为什么会使用其他线程的参数呢?
- 不同的请求都是复用的线程池里的线程,每个请求在没开启新的线程的情况下,都是在一个线程里运行的
- 每个线程都有一个ThreadLocal存储,pagehelper使用的是线程自己的ThreadLocal存储。
- 使用的不是其他线程的参数,还是那一个线程,如果你将线程名称打印出来,名称相同就算同一个线程(前提是每个线程名称没有人为设置为一样的)。pagehelper使用的是当前线程的ThreadLocal里的参数,只是上一次请求后参数没被清理,导致pagehelper错误拼接了sql。