myBatis-plus/myBatisフロークエリは、ビッグデータ量クエリが遅く、メモリオーバーフローの異常を解決します.


myBatis-plus/myBatisフロークエリー、ビッグデータ量クエリー
myBatisというオープンソースフレームワークのメリットは言うまでもなく、myBatis-plusはmyBatisの強化ツールで、フレームワークは私に多くのクエリーデータ方式を提供してくれて、とても便利で、ここではフロークエリー、つまりカーソルの方式でクエリーを紹介します.
私たちは仕事を完成する途中で大きなデータ量のクエリーに遭遇します.例えば、大量のデータのエクスポートなど、list()の方法で直接クエリーすると、フレームワークがデータベースクエリーの大量のデータを私たちが望んでいるエンティティクラスにカプセル化するのに多くの時間とメモリを費やしているので、遅いです.この過程で、私たちのプロジェクトレポートのメモリがOOM(out of memory)の異常をオーバーフローさせる可能性が高いので、この時、フレームワークのオリジナルデータでクエリーする必要があります.以下のようにします.
整理クラスをすべて出して、便利に問題を探して、一部のローカルパスを遮断しました
  • mapper
  • package com.***.mapper;
    
    import com.***.OrgData;
    import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.baomidou.mybatisplus.core.toolkit.Constants;
    import org.apache.ibatis.annotations.*;
    import org.apache.ibatis.mapping.ResultSetType;
    import org.apache.ibatis.session.ResultHandler;
    
    /**
    
     * @Author sugar
     */
    @Mapper
    public interface OrgDataMapper extends BaseMapper<OrgData> {
    
    
        @Select("select * from org_data t ${ew.customSqlSegment}")
        @Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 1000)
        @ResultType(OrgData.class)
        void getOrgWithBigData(@Param(Constants.WRAPPER) QueryWrapper<OrgData> wrapper, ResultHandler<OrgData> handler);
    
    
    
    }
    
    

    コメント:
    @Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 1000)
    
  • ResultSetType.FORWARD_ONLYは、カーソルが
  • だけ前にスクロールすることを示す.
  • fetchSize毎取得量
  •  @ResultType(OrgData.class)
    
  • は、エンティティタイプ
  • に戻るように変換する.
    注意:戻りタイプはvoidでなければなりませんよ.handlerでデータを処理するので、このhanderも必要です.
  • mapper呼び出し
  • を使用
    
            orgDataMapper.getOrgWithBigData(queryWrapper,resultContext -> {
    
                OrgData orgData = resultContext.getResultObject();
               //              
    }
    

    end