Skip to content

Commit 1cafc2e

Browse files
authored
cache ResultSet metadata in getMetaDataMapByMessageId to reduce per-row metadata lookups (#282)
* 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. Signed-off-by: Nico Piel <nico.piel@hotmail.de> * Remove comments Signed-off-by: Nico Piel <nico.piel@hotmail.de> * Cache ResultSet metadata before iterating rows to avoid per-row lookups Cache ResultSetMetaData (column count, types, and names) up front instead of calling getColumnType/getColumnName for every row. This reduces repeated metadata lookups and improves performance when reading metadata rows from the database. Signed-off-by: Nico Piel <nico.piel@hotmail.de> * Whoops Signed-off-by: Nico Piel <nico.piel@hotmail.de> * Unnecessary comments Signed-off-by: Nico Piel <nico.piel@hotmail.de> * 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> --------- Signed-off-by: Nico Piel <nico.piel@hotmail.de>
1 parent a6ae879 commit 1cafc2e

1 file changed

Lines changed: 13 additions & 8 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: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2935,6 +2935,15 @@ 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+
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
2939+
int columnCount = resultSetMetaData.getColumnCount();
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();
2945+
}
2946+
29382947
while (resultSet.next()) {
29392948
Long messageId = resultSet.getLong("message_id");
29402949
Integer metaDataId = resultSet.getInt("metadata_id");
@@ -2951,28 +2960,24 @@ private Map<Long, Map<Integer, Map<String, Object>>> getMetaDataMaps(String chan
29512960
connectorMetaDataMap.put(metaDataId, metaDataMap);
29522961
}
29532962

2954-
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
2955-
int columnCount = resultSetMetaData.getColumnCount();
2956-
29572963
for (int i = 1; i <= columnCount; i++) {
2958-
MetaDataColumnType metaDataColumnType = MetaDataColumnType.fromSqlType(resultSetMetaData.getColumnType(i));
29592964
Object value = null;
29602965

2961-
switch (metaDataColumnType) {//@formatter:off
2966+
switch (columnTypes[i]) {//@formatter:off
29622967
case STRING:
29632968
value = resultSet.getString(i);
29642969
if (encryptor != null && StringUtils.startsWith((String) value, Encryptor.HEADER_INDICATOR)) {
29652970
try {
29662971
value = encryptor.decrypt((String) value);
29672972
} catch (Exception e) {
2968-
logger.debug("Unable to decrypt custom metadata column " + resultSetMetaData.getColumnName(i).toUpperCase() + " for channel " + channelId + ", messsage " + messageId + "-" + metaDataId, e);
2973+
logger.debug("Unable to decrypt custom metadata column " + columnNames[i] + " for channel " + channelId + ", messsage " + messageId + "-" + metaDataId, e);
29692974
}
29702975
}
29712976
break;
29722977
case NUMBER: value = resultSet.getBigDecimal(i); break;
29732978
case BOOLEAN: value = resultSet.getBoolean(i); break;
29742979
case TIMESTAMP:
2975-
2980+
29762981
Timestamp timestamp = resultSet.getTimestamp(i);
29772982
if (timestamp != null) {
29782983
value = Calendar.getInstance();
@@ -2983,7 +2988,7 @@ private Map<Long, Map<Integer, Map<String, Object>>> getMetaDataMaps(String chan
29832988
default: throw new Exception("Unrecognized MetaDataColumnType");
29842989
} //@formatter:on
29852990

2986-
metaDataMap.put(resultSetMetaData.getColumnName(i).toUpperCase(), value);
2991+
metaDataMap.put(columnNames[i], value);
29872992
}
29882993
}
29892994

0 commit comments

Comments
 (0)