<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近測試反饋一個問題,某個查詢全量資訊的介面,有時候返回全量資料,符合預期,但是偶爾又只返回1條資料,簡直就是“見鬼”了,究竟是為什麼出現這樣的“幽靈資料”呢?
首先我們看了下這對程式碼的業務邏輯,非常的簡單,總共沒有幾行程式碼,也沒有分頁邏輯,程式碼如下:
public List<SdSubscription> findAll() { return sdSubscriptionMapper.selectAll(); }
那麼究竟是咋回事呢?講道理不可能出現這種情況的啊,不要慌,我們加點紀錄檔,將紀錄檔級別調整為DEBUG
,讓紀錄檔飛一段時間。
public List<SdSubscription> findAll() { log.info("find the sub start ....."); List<SdSubscription> subs = sdSubscriptionMapper.selectAll(); log.info("find the sub end ....."); return subs; }
果不其然,紀錄檔中出現了奇奇怪怪的分頁引數,如下圖所示:
果然是PageHelper
這個開源框架搞的鬼,我想大家都用過吧,分頁非常方便,那麼究竟為什麼別人都沒問題,單單就我會出現問題呢?
為了回答上面的疑問,我們先看看PageHelper
框架的工作原理吧。
PageHelper
是一個開源的 MyBatis
分頁外掛,它可以幫助開發者在查詢資料時,快速的實現分頁功能。
PageHelper
的工作原理可以簡單概括為以下幾個步驟:
PageHelper
的靜態方法 startPage()
,設定當前頁碼和每頁顯示的記錄數。它會將分頁資訊放到執行緒的ThreadLocal
中,那麼線上程的任何地方都可以存取了。PageHelper
會自動攔截查詢語句,如果發現執行緒的ThreadLocal
中有分頁資訊,那麼就會在其前後新增分頁語句,例如 MySQL
中的 LIMIT
語句。Page
物件中返回,該物件包含分頁資訊和查詢結果列表。finally
中清除執行緒ThreadLocal
中的分頁資訊,避免分頁設定對其他查詢方法的影響。PageHelper
的實現原理主要依賴於攔截器技術和反射機制,通過攔截查詢語句並動態生成分頁語句,實現了簡單、高效、通用的分頁功能。具體原始碼在下圖的類中,非常容易看懂。
明白了PageHelper
的工作原理後,反覆檢查程式碼,都沒有呼叫過startPage
,debug
檢視ThreadLocal
中也沒有分頁資訊啊,懵逼中。那我看看別人寫的新增分頁引數的程式碼吧,不看不知道,一看嚇一跳。
原來有位“可愛”的同事竟然在查詢後,加了一個分頁,就是把分頁資訊放到執行緒的ThreadLocal
中。
那大家是不是有疑問,丁是丁,矛是矛,你的執行緒關我何事?這就要說到我們的tomcat了。
其實這就涉及到我們的tomcat
相關知識了,我們一個瀏覽器發一個介面請求,經過我們的tomcat
的,究竟是一個什麼樣的流程呢?
HTTP
請求到Tomcat
伺服器。Tomcat
的HTTP
聯結器(Connector
)接收到請求,將連線請求交給執行緒池Executor
處理,解析它,然後將請求轉發給對應的Web應用程式。Tomcat
的Web應用程式容器(Container
)接收到請求,根據請求的URL找到對應的Servlet
。關於tomcat中使用執行緒池提交瀏覽器的連線請求的原始碼如下:
從而得知,你的連線請求是從執行緒池從拿的,而拿到的這個執行緒恰好是一個“髒執行緒”,在ThreadLocal
中放了分頁資訊,導致你這邊出現問題。
後來追問了同事具體原因,才發現是粗心導致的。有些bug總是出現的莫名其妙,就像生活一樣。所以關鍵的是我們在使用一些開源框架的時候一定要掌握底層實現的原理、核心的機制,這樣才能夠在解決一些問題的時候有據可循。
以上就是PageHelper引發的幽靈資料問題解析的詳細內容,更多關於PageHelper幽靈資料的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45