Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Retornando um ResultSet


Você nunca deve passar um ResultSet através de métodos públicos. Isso é propenso a vazamento de recursos porque você é forçado a manter a instrução e a conexão abertas. Fechá-los implicitamente fecharia o conjunto de resultados. Mas mantê-los abertos faria com que eles ficassem pendurados e faria com que o banco de dados ficasse sem recursos quando há muitos deles abertos.

Mapeie-o para uma coleção de Javabeans assim e retorne-o:
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;
}

Ou, se você já estiver no Java 7, basta usar tente com recursos declaração que fechará automaticamente esses 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;
}

A propósito, você não deve declarar a Connection , Statement e ResultSet como variáveis ​​de instância (grande problema de segurança de thread!), nem engolir o SQLException nesse ponto (o chamador não terá ideia de que ocorreu um problema), nem fechará os recursos no mesmo try (se, por exemplo, o fechamento do conjunto de resultados lançar uma exceção, a instrução e a conexão ainda estarão abertas). Todos esses problemas são corrigidos nos trechos de código acima.