Skip to content

DefaultResultSetHandler#applyColumnOrderBasedConstructorAutomapping() should call Constructor.getParameterTypes() just once #3113

Closed
@whojes-toss

Description

@whojes-toss

MyBatis version

3.5.14

DefaultResultSetHandler

It's not a bug, but memory resources can be reduced by fixing it i guess

private boolean applyColumnOrderBasedConstructorAutomapping(ResultSetWrapper rsw, List<Class<?>> constructorArgTypes,
List<Object> constructorArgs, Constructor<?> constructor, boolean foundValues) throws SQLException {
for (int i = 0; i < constructor.getParameterTypes().length; i++) {
Class<?> parameterType = constructor.getParameterTypes()[i];
String columnName = rsw.getColumnNames().get(i);
TypeHandler<?> typeHandler = rsw.getTypeHandler(parameterType, columnName);
Object value = typeHandler.getResult(rsw.getResultSet(), columnName);
constructorArgTypes.add(parameterType);
constructorArgs.add(value);
foundValues = value != null || foundValues;
}
return foundValues;
}

In this code block, constructor.getParameterTypes() method is called so much, which clones objects causing memory waste.

private boolean applyColumnOrderBasedConstructorAutomapping(ResultSetWrapper rsw, List<Class<?>> constructorArgTypes, 
     List<Object> constructorArgs, Constructor<?> constructor, boolean foundValues) throws SQLException { 
   for (int i = 0; i < constructor.getParameterTypes().length; i++) { 
     Class<?> parameterType = constructor.getParameterTypes()[i]; 
     String columnName = rsw.getColumnNames().get(i); 
     TypeHandler<?> typeHandler = rsw.getTypeHandler(parameterType, columnName); 
     Object value = typeHandler.getResult(rsw.getResultSet(), columnName); 
     constructorArgTypes.add(parameterType); 
     constructorArgs.add(value); 
     foundValues = value != null || foundValues; 
   } 
   return foundValues; 
}

so i suggest this:

private boolean applyColumnOrderBasedConstructorAutomapping(ResultSetWrapper rsw, List<Class<?>> constructorArgTypes, 
     List<Object> constructorArgs, Constructor<?> constructor, boolean foundValues) throws SQLException { 
   Class<?>[] parameterTypes = constructor.getParameterTypes(); // called once at the beginning
   for (int i = 0; i < parameterTypes.length; i++) { 
     Class<?> parameterType = parameterTypes[i]; 
     String columnName = rsw.getColumnNames().get(i); 
     TypeHandler<?> typeHandler = rsw.getTypeHandler(parameterType, columnName); 
     Object value = typeHandler.getResult(rsw.getResultSet(), columnName); 
     constructorArgTypes.add(parameterType); 
     constructorArgs.add(value); 
     foundValues = value != null || foundValues; 
   } 
   return foundValues; 
}

Metadata

Metadata

Assignees

Labels

polishingImprove a implementation code or doc without change in current behavior/content

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions