Tal vez podrías usar
DatabaseMetaData databaseMetaData = connection.getMetaData();
databaseMetaData.getColumns(null, null, tableName, "%");
Devuelve una fila para cada columna de la tabla.
En este caso, usaría el ResultSet
devuelto en sí mismo, no sus ResultSetMetaData
.
Una ventaja de este enfoque es que no interfiere con el bloqueo y las transacciones de la base de datos.