五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

PageHelper使用分頁(yè)錯(cuò)亂問(wèn)題

2023-09-07 11:25 作者:凱小吧  | 我要投稿

PageMethod源碼

PageHelper 是較為常用的分頁(yè)插件,通過(guò)實(shí)現(xiàn) Mybatis 的 Interceptor 接口完成對(duì) query sql 的動(dòng)態(tài)分頁(yè)。

從PageMethod中可以看出,分頁(yè)參數(shù)由 ThreadLocal 進(jìn)行保存。

大致分為下面幾步

  1. 設(shè)置 page 參數(shù)

  2. 執(zhí)行 query 方法

  3. Interceptor 接口中校驗(yàn) ThreadLocal 中是否存在有設(shè)置的 page 參數(shù)

  4. 存在 page 參數(shù),重新生成 count sql 和 page sql,并執(zhí)行查詢(xún)。不存在 page 參數(shù),直接返回 查詢(xún)結(jié)果

  5. 執(zhí)行 LOCAL_PAGE.remove() 清除 page 參數(shù)

問(wèn)題場(chǎng)景

PageHelper.startPage(dto.getPageNum(), dto.getPageSize());
// 可以換成其它業(yè)務(wù)邏輯
int i = 1 / 0;
List<User> dataList = this.baseMapper.getList();

觀察上述的執(zhí)行過(guò)程,可以發(fā)現(xiàn),如果在第 1 步和第 2 步 之間發(fā)生異常,那么 LOCAL_PAGE 中當(dāng)前線程對(duì)應(yīng)的 page 參數(shù)并不會(huì) remove。 如果不適用線程池那還好,線程在執(zhí)行完畢后會(huì)被銷(xiāo)毀。

用了線程池,當(dāng)前線程執(zhí)行完畢,并不會(huì)被銷(xiāo)毀,會(huì)將當(dāng)前線程存放到池中,標(biāo)記為空閑狀態(tài),以便后續(xù)使用。

后續(xù)使用未被清空參數(shù)的線程時(shí)。

由于線程 的 threadLocals 依舊存在有值,即使沒(méi)有設(shè)置page參數(shù),線程中仍然有參數(shù),從而生成 count sql 和 page sql有問(wèn)題?。?!

從而影響我們的正常查詢(xún)。

解決方案

1. 貼緊【第一個(gè)查詢(xún)有效】

2. try--catch--finally

3. 使用前先清空

4. request請(qǐng)求

請(qǐng)求完成時(shí),清空當(dāng)前線程的threadLocals 屬性值,也就是執(zhí)行 LOCAL_PAGE.remove() 即可。 實(shí)現(xiàn)方式:

使用 aop,對(duì)所有 controller 進(jìn)行處理 實(shí)現(xiàn) HandlerInterceptor 或者 WebRequestInterceptor 對(duì) request 請(qǐng)求的攔截器接口,通過(guò) afterCompletion 方法執(zhí)行 LOCAL_PAGE.remove() 。



PageHelper使用分頁(yè)錯(cuò)亂問(wèn)題的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
东台市| 沛县| 铜川市| 德惠市| 仁布县| 思南县| 营山县| 凤凰县| 曲麻莱县| 浪卡子县| 开平市| 辉县市| 磴口县| 积石山| 乃东县| 济源市| 肇州县| 东港市| 边坝县| 宜黄县| 民县| 特克斯县| 兴义市| 望奎县| 河北区| 东兴市| 北票市| 罗甸县| 桐庐县| 雷山县| 株洲市| 寿阳县| 炎陵县| 宜章县| 隆林| 舞钢市| 罗城| 西藏| 乌兰浩特市| 石台县| 伊宁县|