Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Zurückgeben eines ResultSet

Sie sollten niemals ein ResultSet übergeben herum durch öffentliche Methoden. Dies ist anfällig für Ressourcenlecks, da Sie gezwungen sind, die Anweisung und die Verbindung offen zu halten. Das Schließen würde implizit die Ergebnismenge schließen. Aber sie offen zu halten, würde dazu führen, dass sie herumbaumeln und dazu führen, dass der DB die Ressourcen ausgehen, wenn zu viele von ihnen geöffnet sind.

Ordnen Sie es wie folgt einer Sammlung von Javabeans zu und geben Sie es stattdessen zurück:

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

Wenn Sie bereits Java 7 verwenden, verwenden Sie einfach Versuchen Sie es mit Ressourcen -Anweisung, die diese Ressourcen automatisch schließt:

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

Übrigens sollten Sie die Connection nicht deklarieren , Statement und ResultSet überhaupt als Instanzvariablen verwenden (großes Threadsicherheitsproblem!), noch die SQLException schlucken zu diesem Zeitpunkt (der Aufrufer wird keine Ahnung haben, dass ein Problem aufgetreten ist), noch die Ressourcen im selben try schließen (wenn z. B. result set close eine Ausnahme auslöst, dann sind Anweisung und Verbindung noch offen). All diese Probleme werden in den obigen Codeausschnitten behoben.