Mysql
 sql >> Base de données >  >> RDS >> Mysql

Renvoyer un ResultSet

Vous ne devez jamais passer un ResultSet autour par des méthodes publiques. Ceci est sujet aux fuites de ressources car vous êtes obligé de garder l'instruction et la connexion ouvertes. Les fermer fermerait implicitement le jeu de résultats. Mais les garder ouverts les ferait traîner et entraînerait un manque de ressources dans la base de données lorsqu'il y en aurait trop d'ouvertes.

Associez-le à une collection de Javabeans comme ceci et renvoyez-le à la place :

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, si vous utilisez déjà Java 7, utilisez simplement essayez-avec-ressources instruction qui fermera automatiquement ces ressources :

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;
}

Au fait, vous ne devriez pas déclarer la Connection , Statement et ResultSet en tant que variables d'instance (problème majeur de threadsafe !), ni avaler l'SQLException à ce moment-là (l'appelant n'aura aucune idée qu'un problème s'est produit), ni ne fermera les ressources dans le même try (si, par exemple, la fermeture de l'ensemble de résultats lève une exception, l'instruction et la connexion sont toujours ouvertes). Tous ces problèmes sont résolus dans les extraits de code ci-dessus.