PageHelperのページングが機能しない原因分析


プロジェクトをしているときに問題が発生したとき、フロントのクエリの合計数が0か1のような不正確な数字で表示されていることに気づきました.私のコードはこのように似ています`.
Page result = PageHelper.startPage(query.getPage(), query.getLimit());
//        
List glist = groupMemberMapper.selectByUserIdAndGroupId(BaseContextHandler.getUserID(), "roleType");
List list = this.selectByExample(example);

`後にPageHelperの作者のGitHubのホームページに着いてやっと原因がPageHelperであることを発見した.startPageがプログラムの場所に置かれている理由、リンク付き:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/en/HowToUse.mdチュートリアルでは、「ページングが必要なMyBatisクエリー・メソッドの前にPageHelper.startPage静的メソッドを呼び出すと、このメソッドの後に続く最初のMyBatisクエリー・メソッドがページングされます」と説明しています.PageHelper法は静的ThreadLocalパラメータを使用しているため,ページングパラメータとスレッドはバインドされている.
PageHelperメソッド呼び出し後にMyBatisクエリーメソッドに続くことを保証できる限り、これは安全です.PageHelperはfinallyコードセグメントでThreadLocalに格納されているオブジェクトを自動的に消去するためです.
コードがExecutorに入る前に異常が発生すると、スレッドが使用できなくなります.これは人為的なBug(インタフェースメソッドとXMLの不一致など、MappedStatementが見つからない場合)に属します.この場合、スレッドが使用できないため、ThreadLocalパラメータが誤って使用されることはありません.エラーの例:正しい例: