Executando duas Java PreparedStatements com uma conexão - escolha de estilo

Ok, percebi que realmente fiz muitas perguntas sem contribuir de volta para a comunidade, mas quero suas opiniões sobre isso. Diga se eu tiver

private void closeAll(ResultSet rs, PreparedStatement ps, Connection con) {
    if (rs != null)
        try {
            rs.close();
        } catch (SQLException e) {
        }
    if (ps != null)
        try {
            ps.close();
        } catch (SQLException e) {
        }
    if (con != null)
        try {
            con.close();
        } catch (SQLException e) {
        }
}

e eu queria fazer várias operações no meu banco de dados MySQL usando uma única conexão. É melhor escrever

Connection con = ...;
PreparedStatement ps = null;
ResultSet rs = null;
try {
    ps = con.prepareStatement(...);
    rs = ps.executeQuery();
    if (rs.next()) ...;
} catch (SQLException e) {
    System.err.println("Error: " + e);
} finally {
    closeAll(rs, ps, null);
}
try {
    ps = con.prepareStatement(...);
    rs = ps.executeQuery();
    if (rs.next()) ...;
} catch (SQLException e) {
    System.err.println("Error: " + e);
} finally {
    closeAll(rs, ps, con);
}

o

Connection con = ...;
PreparedStatement ps = null;
ResultSet rs = null;
try {
    ps = con.prepareStatement(...);
    rs = ps.executeQuery();
    if (rs.next()) ...;
    rs.close();
    ps.close();

    ps = con.prepareStatement(...);
    rs = ps.executeQuery();
    if (rs.next()) ...;
} catch (SQLException e) {
    System.err.println("Error: " + e);
} finally {
    closeAll(rs, ps, con);
}

Considero melhor significar mais seguro, mais claro, mais conciso ou mais robusto. Não tenho certeza se o último sempre fechará as declarações e conjuntos de resultados preparados sempre que encontrar uma exceção, enquanto acredito que pareça mais conciso. Mas o primeiro parece mais agradável, pois é mais consistente, mas coloca mais sobrecarga, pois usa mais blocos try tr

Eu percebo que a parte de gerenciamento automático de recursos do Java 7 do Project Coin me forçará a me apoiar no primeiro, pois os recursos usados no cabeçalho são implicitamente finais no corpo. No entanto, tenho algum tempo antes de me preocupar em revisar meu código para adaptá-lo ao ARM e poder remover o código padrão, então a questão ainda permanece: dos dois estilos acima, qual seria a melhor prática? Se os dois adotarem os comportamentos esperados, o último me dará um aumento notável no desempenho que desculparia o estilo "mais feio"?

questionAnswers(4)

yourAnswerToTheQuestion