Open
Description
问题:
在使用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
Labels
No labels