Skip to content

框架层能否增加查询数量的限制? #3436

Open
@mwjmwj

Description

@mwjmwj

问题:
在使用mybatis查询数据时,如果sql编写不得当,会出现全表扫数据,数据很多的话

容易出现内存溢出的问题,能否在 statementid层 对查询的总数做一个可配置的校验

解决思路:
例如:

<select id="query" resultType="java.util.HashMap" maxCountSize="10000"> (也可做成读上下文动态配置,可实时修改)

使用的位置:

org.apache.ibatis.executor.resultset.DefaultResultSetHandler

private void handleRowValuesForSimpleResultMap(ResultSetWrapper rsw, ResultMap resultMap,
    ResultHandler<?> resultHandler, RowBounds rowBounds, ResultMapping parentMapping) throws SQLException {
    DefaultResultContext<Object> resultContext = new DefaultResultContext<>();
    ResultSet resultSet = rsw.getResultSet();
    skipRows(resultSet, rowBounds);
    int queryIndex = 0;
    while (shouldProcessMoreRows(resultContext, rowBounds) && !resultSet.isClosed() && resultSet.next()) {
        queryIndex++;
        if (queryIndex > 当前sql语句配置的最大值) {
                    // 弹出报错,不然继续解析最终会导致oom
            throw new RuntimeException("query Size has large greate 10000!");
        }
        ResultMap discriminatedResultMap = resolveDiscriminatedResultMap(resultSet, resultMap, null);
        Object rowValue = getRowValue(rsw, discriminatedResultMap, null);
        storeObject(resultHandler, resultContext, rowValue, parentMapping, resultSet);
    }

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions