-
Notifications
You must be signed in to change notification settings - Fork 13k
Closed
Labels
polishingImprove a implementation code or doc without change in current behavior/contentImprove a implementation code or doc without change in current behavior/content
Milestone
Description
MyBatis version
3.5.14
DefaultResultSetHandler
It's not a bug, but memory resources can be reduced by fixing it i guess
mybatis-3/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java
Lines 783 to 795 in b044200
| 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/contentImprove a implementation code or doc without change in current behavior/content