Skip to content

Commit b385fd4

Browse files
committed
Cache ResultSet metadata and use 1-based indexing to avoid per-row metadata lookups
Cache ResultSetMetaData (column count, types, and names) before iterating rows and switch to 1-based arrays/loops so resultSet getters can be called directly with the column index. This prevents repeated getColumnType/getColumnName calls for every row and reduces per-row metadata lookups when building connector metadata maps. Signed-off-by: Nico Piel <nico.piel@hotmail.de>
1 parent 6dfda42 commit b385fd4

1 file changed

Lines changed: 10 additions & 11 deletions

File tree

  • donkey/src/main/java/com/mirth/connect/donkey/server/data/jdbc

donkey/src/main/java/com/mirth/connect/donkey/server/data/jdbc/JdbcDao.java

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2937,11 +2937,11 @@ private Map<Long, Map<Integer, Map<String, Object>>> getMetaDataMaps(String chan
29372937

29382938
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
29392939
int columnCount = resultSetMetaData.getColumnCount();
2940-
MetaDataColumnType[] columnTypes = new MetaDataColumnType[columnCount];
2941-
String[] columnNames = new String[columnCount];
2942-
for (int i = 0; i < columnCount; i++) {
2943-
columnTypes[i] = MetaDataColumnType.fromSqlType(resultSetMetaData.getColumnType(i + 1));
2944-
columnNames[i] = resultSetMetaData.getColumnName(i + 1).toUpperCase();
2940+
MetaDataColumnType[] columnTypes = new MetaDataColumnType[columnCount + 1];
2941+
String[] columnNames = new String[columnCount + 1];
2942+
for (int i = 1; i <= columnCount; i++) {
2943+
columnTypes[i] = MetaDataColumnType.fromSqlType(resultSetMetaData.getColumnType(i));
2944+
columnNames[i] = resultSetMetaData.getColumnName(i).toUpperCase();
29452945
}
29462946

29472947
while (resultSet.next()) {
@@ -2960,13 +2960,12 @@ private Map<Long, Map<Integer, Map<String, Object>>> getMetaDataMaps(String chan
29602960
connectorMetaDataMap.put(metaDataId, metaDataMap);
29612961
}
29622962

2963-
for (int i = 0; i < columnCount; i++) {
2963+
for (int i = 1; i <= columnCount; i++) {
29642964
Object value = null;
2965-
int colIndex = i + 1;
29662965

29672966
switch (columnTypes[i]) {//@formatter:off
29682967
case STRING:
2969-
value = resultSet.getString(colIndex);
2968+
value = resultSet.getString(i);
29702969
if (encryptor != null && StringUtils.startsWith((String) value, Encryptor.HEADER_INDICATOR)) {
29712970
try {
29722971
value = encryptor.decrypt((String) value);
@@ -2975,11 +2974,11 @@ private Map<Long, Map<Integer, Map<String, Object>>> getMetaDataMaps(String chan
29752974
}
29762975
}
29772976
break;
2978-
case NUMBER: value = resultSet.getBigDecimal(colIndex); break;
2979-
case BOOLEAN: value = resultSet.getBoolean(colIndex); break;
2977+
case NUMBER: value = resultSet.getBigDecimal(i); break;
2978+
case BOOLEAN: value = resultSet.getBoolean(i); break;
29802979
case TIMESTAMP:
29812980

2982-
Timestamp timestamp = resultSet.getTimestamp(colIndex);
2981+
Timestamp timestamp = resultSet.getTimestamp(i);
29832982
if (timestamp != null) {
29842983
value = Calendar.getInstance();
29852984
((Calendar) value).setTimeInMillis(timestamp.getTime());

0 commit comments

Comments
 (0)