sql >> Base de Datos >  >> RDS >> Mysql

Devolver un ResultSet

Nunca debe pasar un ResultSet alrededor a través de métodos públicos. Esto es propenso a la fuga de recursos porque está obligado a mantener abiertas la declaración y la conexión. Cerrarlos cerraría implícitamente el conjunto de resultados. Pero mantenerlos abiertos haría que se balancearan y que la base de datos se quedara sin recursos cuando hay demasiados abiertos.

Asignarlo a una colección de Javabeans como este y devolverlo en su lugar:

public List<Biler> list() throws SQLException {
    Connection connection = null;
    PreparedStatement statement = null;
    ResultSet resultSet = null;
    List<Biler> bilers = new ArrayList<Biler>();

    try {
        connection = database.getConnection();
        statement = connection.prepareStatement("SELECT id, name, value FROM Biler");
        resultSet = statement.executeQuery();

        while (resultSet.next()) {
            Biler biler = new Biler();
            biler.setId(resultSet.getLong("id"));
            biler.setName(resultSet.getString("name"));
            biler.setValue(resultSet.getInt("value"));
            bilers.add(biler);
        }
    } finally {
        if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {}
        if (statement != null) try { statement.close(); } catch (SQLException ignore) {}
        if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
    }

    return bilers;
}

O, si ya tiene Java 7, utilice prueba-con-recursos declaración que cerrará automáticamente esos recursos:

public List<Biler> list() throws SQLException {
    List<Biler> bilers = new ArrayList<Biler>();

    try (
        Connection connection = database.getConnection();
        PreparedStatement statement = connection.prepareStatement("SELECT id, name, value FROM Biler");
        ResultSet resultSet = statement.executeQuery();
    ) {
        while (resultSet.next()) {
            Biler biler = new Biler();
            biler.setId(resultSet.getLong("id"));
            biler.setName(resultSet.getString("name"));
            biler.setValue(resultSet.getInt("value"));
            bilers.add(biler);
        }
    }

    return bilers;
}

Por cierto, no deberías declarar la Connection , Statement y ResultSet como variables de instancia en absoluto (¡problema importante de seguridad de subprocesos!), ni tragarse la SQLException en ese momento (la persona que llama no tendrá idea de que ocurrió un problema), ni cerrará los recursos en el mismo try (si, por ejemplo, el cierre del conjunto de resultados arroja una excepción, entonces la declaración y la conexión aún están abiertas). Todos esos problemas se solucionan en los fragmentos de código anteriores.