ページングに失敗した試行について


2年間働いて、いくつかのプロジェクトで既存のものを改善するのは自然なことのようです.
ページングクエリーの差は多くありません.各プロジェクトで使用するものです.比較的一般的な実現方法は、データベースで直接ページングし、異なるデータベースに対してページング方式も異なります.一般的にコードはこうです:(mysqlを使います)
/**
	 *       
	 * @param pageInfo               。
	 * @param sql        
	 * @param pageStart    
	 * @param pageSize        
	 * @param args     
	 * @return         
	 */
	public <T> Page<T> paginate(Class<T> pageInfo,String sql, int pageStart, int pageSize,String sort,String sortD,Object... args) {
		StringBuilder pageSql=new StringBuilder(128);
		
		pageSql.append(sql).append(" LIMIT ").append(pageStart).append(",").append(pageSize);
		
		if(sort!=null&&sortD!=null){//      
			pageSql.append(" order by ").append(sort).append(" ").append(sortD);
		}
		String pageCount="select count(1) "+sql.substring(sql.indexOf("from "));//   from       select  count(1)
		Integer total=queryObject(pageCount, Integer.class, args);// springTemple        ,  sql,      
		List<T> data= queryObjectList(pageSql.toString(), pageInfo, args);//  sql,           
		Page<T> page=new Page<T>(data, total);
		return page;
	}

この方法も古典的でしょうが、同じページングクエリーに対して、ページ間のジャンプだけをすると記録総数のクエリーを取得して重複労働をしているのではないでしょうか.このため、私の考えはクエリー文に対して、クエリー条件をhashして、その情報の要約を抽出して、要約をキーにして記録を常にキャッシュに保存して、このキャッシュはセッションと関係があるほうがいいです.セッションが終わったらキャッシュを解放することができます.私のコードは次のようになっています.
public <T> Page<T> paginate(Class<T> pageInfo,String sql, int pageStart, int pageSize,String sort,String sortD,Object... args) {
		/*        ,                    ,        ,                         */
		String pageHash;
		if(args==null){//    
			pageHash=FrameUtils.encryptMD5(sql);
		}else{
			pageHash=FrameUtils.encryptMD5(sql, Arrays.asList(args).toString());
		}
		
		StringBuilder pageSql=new StringBuilder(128);
		
		pageSql.append(sql).append(" LIMIT ").append(pageStart).append(",").append(pageSize);
		
		if(sort!=null&&sortD!=null){//      
			pageSql.append(" order by ").append(sort).append(" ").append(sortD);
		}
		
		String pageCount="select count(1) "+sql.substring(sql.indexOf("from "));//   select   from        count(1)

		/*         ,   shiro     ,           ,     */
		Session session=SecurityUtils.getSubject().getSession();
		Integer total;
		if(session.getAttribute(pageHash)!=null){
			/*    ,         */
			total=(Integer)session.getAttribute(pageHash);
		}else{
			/*          ,     */
			total=queryObject(pageCount, Integer.class, args);
			session.setAttribute(pageHash, total);
		}
		Integer total=queryObject(pageCount, Integer.class, args);
		List<T> data= queryObjectList(pageSql.toString(), pageInfo, args);
		Page<T> page=new Page<T>(data, total);
		return page;
	}

私が新しい削除を実現しようとしたとき、それがどんなに幼稚な考えなのか、ページングされたデータが変動すると、データの総数が実際のデータと一致しないことに気づいた.最後のページをめくると問題点が明らかになります.
一般的なページング方式としては望ましくない.
しかし、この方法は特殊な環境でも有用である.たとえば、クエリーのみを行う場合、データ総数はクエリー時に変化しなければ問題ありません.また、データ量が多く、データのページング全体の表示が実際のデータと一致しない環境で許容できるのも良い方法です.
しかし、総じて言えば、共通のページ分けの新しい方法を作ろうとしたが、結局失敗したが、ずいぶん進歩した.