sql >> Database >  >> RDS >> Mysql

Een resultatenset retourneren

U mag nooit een ResultSet doorgeven rond via openbare methoden. Dit is vatbaar voor het lekken van bronnen, omdat u gedwongen bent de verklaring en de verbinding open te houden. Als u ze sluit, wordt de resultatenset impliciet gesloten. Maar door ze open te houden, zouden ze rond bungelen en ervoor zorgen dat de DB geen bronnen meer heeft als er te veel open zijn.

Wijs het toe aan een verzameling Javabeans zoals zo en stuur het in plaats daarvan terug:

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

Of, als je al op Java 7 werkt, gebruik dan try-with-resources verklaring die deze bronnen automatisch zal sluiten:

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

Trouwens, je zou de Connection . niet moeten aangeven , Statement en ResultSet helemaal niet als instantievariabelen (groot threadsafety-probleem!), noch door de SQLException in te slikken op dat moment helemaal niet (de beller heeft geen idee dat er een probleem is opgetreden), noch sluit hij de bronnen in dezelfde try (als bijvoorbeeld resultaatset close een uitzondering genereert, zijn statement en verbinding nog steeds open). Al deze problemen zijn opgelost in de bovenstaande codefragmenten.



  1. SQL Tabel vullen met willekeurige gegevens

  2. 15 handige tips voor het afstemmen en optimaliseren van MySQL/MariaDB-prestaties

  3. Hoe werkt bevat() in PL-SQL?

  4. Hoe programmeer je een MySQL-trigger om een ​​rij in een andere tabel in te voegen?