zoukankan      html  css  js  c++  java
  • MyBatis读取大量数据(流式读取)

    ## 一、背景
    导出大量数据时,虚拟机频繁GC,内存耗尽,CPU爆满,可采用Mybatis数据流式读取进行优化。

    ## 二、JDBC三种读取方式:
    1. 一次全部(默认):一次获取全部。
    2. 流式:多次获取,一次一行。
    3. 游标:多次获取,一次多行。

    mybatis默认采取第一种。

    ## 三、实现
    ### 1. Business层
    ```java
    //最终查询的List结果
    List<FinancePackageFutureResponseVO> financePackageFutureList = new ArrayList<>();
    financeOrderDao.seachDataList(financeOrderPackageRequestVO, new ResultHandler<FinancePackageFutureResponseVO>() {
        @Override
        public void handleResult(ResultContext<? extends FinancePackageFutureResponseVO> resultContext) {
            /**回调处理逻辑 */
            financePackageFutureList.add(resultContext.getResultObject());
        }
    });
    ```

    ### 2. Dao层
    ```java
    /**
     * 流式读取数据
     * @param financeOrderPackageRequestVO 查询对象
     * @param handler                      回调处理
     */
    void seachDataList(FinanceOrderPackageRequestVO financeOrderPackageRequestVO, ResultHandler<FinancePackageFutureResponseVO> handler);
    ```

    ### 3. Mapper层
    ```java
    <!--
    resultSetType:结果集的游标只能向下滚动
    fetchSize:窗口值
    -->
    <select id="seachDataList" resultMap="SeachDataResultMap" resultSetType="FORWARD_ONLY" fetchSize="1000">
        select i.created_date as createdDate, i.orde_order_inside_no as ordeOrderInsideNo from fina_finance_order_item_expense e
    </select>
    ```

  • 相关阅读:
    需求征集系统第四天
    EL表达式和JSTL
    需求征集系统第三天
    [2019.1.6]BZOJ4197 [Noi2015]寿司晚宴
    [2019.1.7]BZOJ1011 [HNOI2008]遥远的行星
    [2019.1.3]BZOJ4326 NOIP2015 运输计划
    [2019.1.2]BZOJ2115 [Wc2011] Xor
    [2019.1.2]BZOJ2460 [BeiJing2011]元素
    [2019.1.1]BZOJ1806 [Ioi2007]Miners 矿工配餐
    [2019.1.1]BZOJ4195 [Noi2015]程序自动分析
  • 原文地址:https://www.cnblogs.com/yifanSJ/p/12658536.html
Copyright © 2011-2022 走看看