@@ -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