天天看點

Mybatis插件PageHelper使用坑

Mybatis PageHelper 使用的坑

背景:

web每發起一次請求,便是一個線程。servlet 本身維護了一個線程池,每次發起的請求會從該線程池裡擷取,用完回收進線程池。

現象:

如果某次查詢請求,建立了PageHelper.startPage(),那麼便會像目前線程的ThreadLocal對象中存入Page對象。如果不立馬進行查詢,消費掉PageHelper的page對象,那麼當下次發起另一個請求,拿出該線程時,如果有查詢另一個資料庫的操作,便會被ThreadLocal中的Page對象攔截将條件拼接到sql語句後面,然而實際代碼中的sql并沒有拼接Page中的條件,導緻查詢資料庫直接報sql錯誤。

這就是PageHelper的沒有緊跟查詢資料庫操作被消費而導緻的線程不安全現象!

解決辦法:

PageHelper 一旦被建立了之後,目前線程傳回之前必須有查詢資料庫的操作去消費PageHelper中的Page對象,不可在沒有消費PageHelper之前return