Skip to content

Commit 71ebfc5

Browse files
kazuki43zooharawata
authored andcommitted
Fix to reduce memory usage
fix gh-830
1 parent c24e07b commit 71ebfc5

File tree

1 file changed

+12
-24
lines changed

1 file changed

+12
-24
lines changed

src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
* @author Clinton Begin
6565
* @author Eduardo Macarron
6666
* @author Iwao AVE!
67+
* @author Kazuki Shimizu
6768
*/
6869
public class DefaultResultSetHandler implements ResultSetHandler {
6970

@@ -91,6 +92,9 @@ public class DefaultResultSetHandler implements ResultSetHandler {
9192

9293
// Cached Automappings
9394
private final Map<String, List<UnMappedColumnAutoMapping>> autoMappingsCache = new HashMap<String, List<UnMappedColumnAutoMapping>>();
95+
96+
// temporary marking flag that indicate using constructor mapping (use field to reduce memory usage)
97+
private boolean useConstructorMappings;
9498

9599
private static class PendingRelation {
96100
public MetaObject metaObject;
@@ -376,11 +380,10 @@ private void skipRows(ResultSet rs, RowBounds rowBounds) throws SQLException {
376380

377381
private Object getRowValue(ResultSetWrapper rsw, ResultMap resultMap) throws SQLException {
378382
final ResultLoaderMap lazyLoader = new ResultLoaderMap();
379-
final ResultObject resultObject = createResultObject(rsw, resultMap, lazyLoader, null);
380-
Object rowValue = resultObject.getValue();
383+
Object rowValue = createResultObject(rsw, resultMap, lazyLoader, null);
381384
if (rowValue != null && !hasTypeHandlerForResultObject(rsw, resultMap.getType())) {
382385
final MetaObject metaObject = configuration.newMetaObject(rowValue);
383-
boolean foundValues = resultObject.isUseConstructorMappings();
386+
boolean foundValues = this.useConstructorMappings;
384387
if (shouldApplyAutomaticMappings(resultMap, false)) {
385388
foundValues = applyAutomaticMappings(rsw, resultMap, metaObject, null) || foundValues;
386389
}
@@ -568,7 +571,8 @@ private CacheKey createKeyForMultipleResults(ResultSet rs, ResultMapping resultM
568571
// INSTANTIATION & CONSTRUCTOR MAPPING
569572
//
570573

571-
private ResultObject createResultObject(ResultSetWrapper rsw, ResultMap resultMap, ResultLoaderMap lazyLoader, String columnPrefix) throws SQLException {
574+
private Object createResultObject(ResultSetWrapper rsw, ResultMap resultMap, ResultLoaderMap lazyLoader, String columnPrefix) throws SQLException {
575+
this.useConstructorMappings = false; // reset previous mapping result
572576
final List<Class<?>> constructorArgTypes = new ArrayList<Class<?>>();
573577
final List<Object> constructorArgs = new ArrayList<Object>();
574578
Object resultObject = createResultObject(rsw, resultMap, constructorArgTypes, constructorArgs, columnPrefix);
@@ -582,8 +586,8 @@ private ResultObject createResultObject(ResultSetWrapper rsw, ResultMap resultMa
582586
}
583587
}
584588
}
585-
final boolean useConstructorMappings = (resultObject != null && !constructorArgTypes.isEmpty());
586-
return new ResultObject(resultObject, useConstructorMappings);
589+
this.useConstructorMappings = (resultObject != null && !constructorArgTypes.isEmpty()); // set current mapping result
590+
return resultObject;
587591
}
588592

589593
private Object createResultObject(ResultSetWrapper rsw, ResultMap resultMap, List<Class<?>> constructorArgTypes, List<Object> constructorArgs, String columnPrefix)
@@ -852,11 +856,10 @@ private Object getRowValue(ResultSetWrapper rsw, ResultMap resultMap, CacheKey c
852856
ancestorObjects.remove(resultMapId);
853857
} else {
854858
final ResultLoaderMap lazyLoader = new ResultLoaderMap();
855-
final ResultObject resultObject = createResultObject(rsw, resultMap, lazyLoader, columnPrefix);
856-
rowValue = resultObject.getValue();
859+
rowValue = createResultObject(rsw, resultMap, lazyLoader, columnPrefix);
857860
if (rowValue != null && !hasTypeHandlerForResultObject(rsw, resultMap.getType())) {
858861
final MetaObject metaObject = configuration.newMetaObject(rowValue);
859-
boolean foundValues = resultObject.isUseConstructorMappings();
862+
boolean foundValues = this.useConstructorMappings;
860863
if (shouldApplyAutomaticMappings(resultMap, true)) {
861864
foundValues = applyAutomaticMappings(rsw, resultMap, metaObject, columnPrefix) || foundValues;
862865
}
@@ -1101,19 +1104,4 @@ private boolean hasTypeHandlerForResultObject(ResultSetWrapper rsw, Class<?> res
11011104
return typeHandlerRegistry.hasTypeHandler(resultType);
11021105
}
11031106

1104-
private static class ResultObject {
1105-
private final Object value;
1106-
private final boolean useConstructorMappings;
1107-
private ResultObject(Object value, boolean useConstructorMappings) {
1108-
this.value = value;
1109-
this.useConstructorMappings = useConstructorMappings;
1110-
}
1111-
private Object getValue() {
1112-
return value;
1113-
}
1114-
private boolean isUseConstructorMappings() {
1115-
return useConstructorMappings;
1116-
}
1117-
}
1118-
11191107
}

0 commit comments

Comments
 (0)