Mybatis PageHelper 使用的坑
背景:
web每發起一次請求,便是一個線程。servlet 本身維護了一個線程池,每次發起的請求會從該線程池裡擷取,用完回收進線程池。
現象:
如果某次查詢請求,建立了PageHelper.startPage(),那麼便會像目前線程的ThreadLocal對象中存入Page對象。如果不立馬進行查詢,消費掉PageHelper的page對象,那麼當下次發起另一個請求,拿出該線程時,如果有查詢另一個資料庫的操作,便會被ThreadLocal中的Page對象攔截将條件拼接到sql語句後面,然而實際代碼中的sql并沒有拼接Page中的條件,導緻查詢資料庫直接報sql錯誤。
這就是PageHelper的沒有緊跟查詢資料庫操作被消費而導緻的線程不安全現象!
解決辦法:
PageHelper 一旦被建立了之後,目前線程傳回之前必須有查詢資料庫的操作去消費PageHelper中的Page對象,不可在沒有消費PageHelper之前return