Skip to content

Commit e778f04

Browse files
committed
cache ResultSet metadata in getMetaDataMapByMessageId to reduce per-row metadata lookups
Cache ResultSetMetaData (column count, types, and names) before iterating rows so getColumnType/getColumnName are not called for every row. Adjust column indexing and decryption logging to use the cached metadata. This reduces repeated metadata calls and improves performance when reading connector metadata from the database.
1 parent a6ae879 commit e778f04

1 file changed

Lines changed: 27 additions & 13 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: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2935,7 +2935,24 @@ private Map<Long, Map<Integer, Map<String, Object>>> getMetaDataMaps(String chan
29352935
statement = connection.prepareStatement(querySource.getQuery("getMetaDataMapByMessageId", values));
29362936
resultSet = statement.executeQuery();
29372937

2938+
// Cache ResultSet metadata before the loop — the schema is the same for every row,
2939+
// so calling getMetaData()/getColumnType()/getColumnName() per row is wasteful.
2940+
MetaDataColumnType[] columnTypes = null;
2941+
String[] columnNames = null;
2942+
int columnCount = 0;
2943+
29382944
while (resultSet.next()) {
2945+
if (columnTypes == null) {
2946+
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
2947+
columnCount = resultSetMetaData.getColumnCount();
2948+
columnTypes = new MetaDataColumnType[columnCount];
2949+
columnNames = new String[columnCount];
2950+
for (int i = 0; i < columnCount; i++) {
2951+
columnTypes[i] = MetaDataColumnType.fromSqlType(resultSetMetaData.getColumnType(i + 1));
2952+
columnNames[i] = resultSetMetaData.getColumnName(i + 1).toUpperCase();
2953+
}
2954+
}
2955+
29392956
Long messageId = resultSet.getLong("message_id");
29402957
Integer metaDataId = resultSet.getInt("metadata_id");
29412958

@@ -2951,29 +2968,26 @@ private Map<Long, Map<Integer, Map<String, Object>>> getMetaDataMaps(String chan
29512968
connectorMetaDataMap.put(metaDataId, metaDataMap);
29522969
}
29532970

2954-
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
2955-
int columnCount = resultSetMetaData.getColumnCount();
2956-
2957-
for (int i = 1; i <= columnCount; i++) {
2958-
MetaDataColumnType metaDataColumnType = MetaDataColumnType.fromSqlType(resultSetMetaData.getColumnType(i));
2971+
for (int i = 0; i < columnCount; i++) {
29592972
Object value = null;
2973+
int colIndex = i + 1;
29602974

2961-
switch (metaDataColumnType) {//@formatter:off
2975+
switch (columnTypes[i]) {//@formatter:off
29622976
case STRING:
2963-
value = resultSet.getString(i);
2977+
value = resultSet.getString(colIndex);
29642978
if (encryptor != null && StringUtils.startsWith((String) value, Encryptor.HEADER_INDICATOR)) {
29652979
try {
29662980
value = encryptor.decrypt((String) value);
29672981
} catch (Exception e) {
2968-
logger.debug("Unable to decrypt custom metadata column " + resultSetMetaData.getColumnName(i).toUpperCase() + " for channel " + channelId + ", messsage " + messageId + "-" + metaDataId, e);
2982+
logger.debug("Unable to decrypt custom metadata column " + columnNames[i] + " for channel " + channelId + ", messsage " + messageId + "-" + metaDataId, e);
29692983
}
29702984
}
29712985
break;
2972-
case NUMBER: value = resultSet.getBigDecimal(i); break;
2973-
case BOOLEAN: value = resultSet.getBoolean(i); break;
2986+
case NUMBER: value = resultSet.getBigDecimal(colIndex); break;
2987+
case BOOLEAN: value = resultSet.getBoolean(colIndex); break;
29742988
case TIMESTAMP:
2975-
2976-
Timestamp timestamp = resultSet.getTimestamp(i);
2989+
2990+
Timestamp timestamp = resultSet.getTimestamp(colIndex);
29772991
if (timestamp != null) {
29782992
value = Calendar.getInstance();
29792993
((Calendar) value).setTimeInMillis(timestamp.getTime());
@@ -2983,7 +2997,7 @@ private Map<Long, Map<Integer, Map<String, Object>>> getMetaDataMaps(String chan
29832997
default: throw new Exception("Unrecognized MetaDataColumnType");
29842998
} //@formatter:on
29852999

2986-
metaDataMap.put(resultSetMetaData.getColumnName(i).toUpperCase(), value);
3000+
metaDataMap.put(columnNames[i], value);
29873001
}
29883002
}
29893003

0 commit comments

Comments
 (0)