Talvez você pudesse usar
DatabaseMetaData databaseMetaData = connection.getMetaData();
databaseMetaData.getColumns(null, null, tableName, "%");
Ele retorna uma linha para cada coluna da tabela.
Nesse caso, você usaria o
ResultSet
retornado em si, não seu ResultSetMetaData
. Uma vantagem dessa abordagem é que ela não interfere no bloqueio e nas transações do banco de dados.